Bottle: Micro Web Framework

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

uKev hat geschrieben:Wie loggt man sich wieder aus ;)?
Geht bei den meisten Browser nicht so ohne weiteres.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
uKev
User
Beiträge: 15
Registriert: Mittwoch 9. Dezember 2009, 13:43

D.h. man müsste tricksen, z.B. mit einem erneuten 401?
Klingt nicht so schön.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

uKev hat geschrieben:D.h. man müsste tricksen, z.B. mit einem erneuten 401?
Klingt nicht so schön.
HTTP-Auth ist eben nicht zum Ausloggen gedacht.

Wenn du einen 401 ohne den Header zurückgibst und gleichzeitig vom Inhalt her eine "normale" Seite zurückgibst, ist das IMHO gar nicht soo tricky ;)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
webwurst
User
Beiträge: 7
Registriert: Sonntag 7. Februar 2010, 02:23

Du kannst auch tricksen indem du einen Redirect auf http://user:password@server.blub/bla
veranlasst. Dann wird auf jeden Fall der alte User verworfen.
Dann könntest bei diesem bestimmtem user:password wieder redirecten auf die seite ohne user:password davor ;)
Danach sollte auch die zurück-Knöpfe im Browser nicht mehr zu dem ursprünglichen User mit Passwort zurückfinden..

Ist leider alles nen bisschen doof mit Http-Auth. Die Mozilla-Leute arbeiten an ner neuen Idee:
https://wiki.mozilla.org/Labs/Weave/Ide ... pec/Latest
Aber das muss dann ja auch erstmal jeder Browser unterstützen :/
plakna
User
Beiträge: 1
Registriert: Dienstag 18. Mai 2010, 21:20

Hallo,

ich hab eine kleine Frage.

Kann man irgendwie herausfinden über domain der user kommt? Wenn ich irgendwie die gesamte Url auslesen könnte, dann wäre das schon super.

Sinngemäß möchte ich so etwas bauen (funktioniert natürlich nicht):

Code: Alles auswählen

from bottle import route, run

@route('http://blabla.de')
def hde():
    return "hallo deutschland!"

@route('http://blabla.at')
def hat():
    return "hallo oesterreich!"

run(port=8080, reloader=True)
Hat wer eine Idee? Danke vorab für eine Antwort.

lg, Niklas
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

`request.url` (in der aktuellen git-Version gesehn, bin mir nicht sicher, ob das schon released wurde.)
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Wurde es noch nicht. Der Code, der dafür nötig ist, ist aber auch schon recht aufschlussreich:

Code: Alles auswählen

scheme = environ.get('wsgi.url_scheme', 'http')
host = environ.get('HTTP_X_FORWARDED_HOST', environ.get('HTTP_HOST', None))
if not host:
    host = environ.get('SERVER_NAME')
    port = environ.get('SERVER_PORT', '80')
    if scheme + port not in ('https443', 'http80'):
        host += ':' + port
Wie du siehst, es ist nicht ganz so einfach :)
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Der letzte Release Candidate für Bottle 0.8 ist draußen: http://github.com/defnull/bottle/tree/release-0.8

Bis auf letzte bugfixes und Dokumentation ist diese Version endgültig und wird bald auch offiziell (debian, ubuntu, pypi) veröffentlicht.

Im gleichen Zug habe ich auch die Dokumentation erweitert: http://bottle.paws.de/docs/
Bottle: Micro Web Framework + Development Blog
Jack Daniels
User
Beiträge: 30
Registriert: Freitag 1. Januar 2010, 11:38

Ich habe Bottle per WSGI laufen (genau so, wie es im Tutorial erklärt wird) und es funktioniert auch einwandfrei, nur die statischen Dateien habe ich noch nicht zum laufen bekommen. Wenn ich eine statische Datei aufrufen will bekomme ich einen 404. Die Funktion sieht genau so aus wie die im ersten Post dieses Threads, also

Code: Alles auswählen

@route('/static/:filename#.*#')
def static_file(filename):
    send_file(filename, root='/path/to/static/files/')
Das einzige was mir einfallen würde wäre, dass ich 'root' falsch angegeben habe. Muss man in meinem Fall (WSGI) den Pfad relativ zur WSGI-Datei oder von / aus angeben? Beides habe ich eigentlich ausprobiert, aber ich weiß ja nicht.

Wäre cool, wenn du mir sagen könntest, an was das liegt.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Welchen Server verwendest du denn?
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

leg' die Datei mal in den Root-Pfad deiner WSGI-Applikation und gibt als root '' oder '/' und guck mal, was passiert.

Gruß, noisefloor
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Der root-pfad kann relativ, sollte aber absolut angegeben werden, da z.B. mod_wsgi nicht das Projekt-Verzeichnis als 'aktuelles' Verzeichnis annimmt, sondern das des init-Scripts, mit dem Apache gestartet wurde (oder so).

Es gibt übrigens einen Unterschied zwischen "404 Not Found: ..." und "404 File does not exist." Beim ersten wurde nicht einmal die route gefunden, beim zweiten war die Route richtig, die Datei aber nicht vorhanden.
Bottle: Micro Web Framework + Development Blog
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Defnull hat geschrieben:Der root-pfad kann relativ, sollte aber absolut angegeben werden, da z.B. mod_wsgi nicht das Projekt-Verzeichnis als 'aktuelles' Verzeichnis annimmt, sondern das des init-Scripts, mit dem Apache gestartet wurde (oder so).
Kannst du Bottle nicht so aendern, dass es keine relativen Pfade braucht?
TUFKAB – the user formerly known as blackbird
Jack Daniels
User
Beiträge: 30
Registriert: Freitag 1. Januar 2010, 11:38

Der Server ist nen Apache, dementsprechend mit mod_python.
leg' die Datei mal in den Root-Pfad deiner WSGI-Applikation und gibt als root '' oder '/' und guck mal, was passiert.
funktioniert leider auch nicht.

Der Fehler heißt "Not Found". Wusste ich gar nicht, dass es da zwei verscheidene gibt...

Aber ich bin grade auf die phänomenale Idee gekommen, in den Logs nachzuschauen (hätt ich früher drauf kommen können :roll: ) und da steht

Code: Alles auswählen

Target WSGI script not found or unable to stat: *Pfad zur Seite*/hp.wsgistatic
, wobei meine WSGI-Datei 'hp.wsgi' heißt und 'static' der Ordner ist, in dem die statischen Dateien sein sollen (wie im Beispiel). Ich kann mir aber nicht erklären, wie er auf das Gebilde kommt...
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

mitsuhiko hat geschrieben:
Defnull hat geschrieben:Der root-pfad kann relativ, sollte aber absolut angegeben werden, da z.B. mod_wsgi nicht das Projekt-Verzeichnis als 'aktuelles' Verzeichnis annimmt, sondern das des init-Scripts, mit dem Apache gestartet wurde (oder so).
Kannst du Bottle nicht so aendern, dass es keine relativen Pfade braucht?
Ich wüsste nicht, wie das auf eine einfache und gleichzeitig saubere Art gehen sollte. Der __name__ Trick von Flask ist zwar nett, mit aber noch eine Spur zu magisch. Viele User dürften den Sinn nicht verstehen oder fehlinterpretieren. Spielereien mit dem call-stack sind ebenfalls möglich, aber schwer zu debuggen und nicht von jeder Python Implementierung abgedeckt.

Mir fällt höchstens eine abb-gebundene Konfiguration des Root-Pfades ein, so das alle relativen Pfade intern erst einmal mit dieser konfigurierten Root-Pfad gejoint werden. Sowas wie:

Code: Alles auswählen

app.set_root(__file__)

Ich kann das ja mal einbauen und sehen, wie es angenommen wird. Auf jeden fall wäre das besser als os.chdir().
Bottle: Micro Web Framework + Development Blog
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Defnull hat geschrieben:Ich wüsste nicht, wie das auf eine einfache und gleichzeitig saubere Art gehen sollte. Der __name__ Trick von Flask ist zwar nett, mit aber noch eine Spur zu magisch.
Das ist nicht magisch, das ist so wie jedes Python package funktioniert das Daten relativ zu seinem Speicherort laed. "os.path.join(os.path.dirname(__file__), '...')". Ist soweit ich weiss sogar dokumentiert in Python's docs.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

mitsuhiko hat geschrieben:
Defnull hat geschrieben:Ich wüsste nicht, wie das auf eine einfache und gleichzeitig saubere Art gehen sollte. Der __name__ Trick von Flask ist zwar nett, mit aber noch eine Spur zu magisch.
Das ist nicht magisch, das ist so wie jedes Python package funktioniert das Daten relativ zu seinem Speicherort laed. "os.path.join(os.path.dirname(__file__), '...')". Ist soweit ich weiss sogar dokumentiert in Python's docs.
Mit "magisch" meine ich den __name__ Trick, nicht die Benutzung von __file__. Wenn ich es richtig verstanden habe, benutzt Flask den Inhalt von __name__ um anschließend im sys.modules dict nach dem Modul und seinem __file__ Attribut zu schauen. Flask gelangt so mit ein paar Umwegen an den Pfad zum Modul, in dem Flask instantiiert wird.

"Unmagischer" fände ich dagegen eine "app.set_root(__file__)" oder "app=Bottle(root=__file__)" Lösung. Dann weiß der Benutzer, was er tut und kann dieses Wissen auch ausnutzen, um Sonderfälle (z.B. komplett extern gespeicherte Ressourcen) zu lösen.

Eigentlich tritt das Problem nur mit mod_wsgi auf, da der Benutzer dort keine Kontrolle über das Arbeitsverzeichnis hat und es auch nicht ändern darf. Da mod_wsgi auch in anderen Punkten deutlich vom üblichen Deployment abweicht, hab ich dafür gerade einen neuen Server Adapter geschrieben. Nun kann man mod_wsgi genau so anbinden wie alle anderen Server auch. Die "Do not run run()" Sonderregel entfällt und das "application" Objekt im globalen Modul-Namensraum ist auch überflüssig. Der Pfad zum wsgi script wird automatisch ermittelt (ohne Benutzer-Angabe von __name__ oder __file__) und die Template-Pfade angepasst. Klappt soweit alles. Da hätte ich mal früher drauf kommen können.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Jack Daniels hat geschrieben:Der Server ist nen Apache, dementsprechend mit mod_python.
mod_python ist tot. Du solltest dringend zu mod_wsgi wechseln.
Jack Daniels hat geschrieben:

Code: Alles auswählen

Target WSGI script not found or unable to stat: *Pfad zur Seite*/hp.wsgistatic
. Ich kann mir aber nicht erklären, wie er auf das Gebilde kommt...
Sieht nach einem Apache-Konfigurationsfehler aus. Wenn du es genau so machst, "wie es im Tutorial erklärt wird", kann es auch nicht klappen, da das Tutorial auf mod_wsgi aufbaut und auf mod_python gar nicht eingeht.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn ich Bottle 0.8.RC1 von github benutze und "run(reloader=True)" setze läuft Bottle direkt in eine endlose Reload-Schleife...

Gruß, noisefloor
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Mist, das hat sich wohl bei http://github.com/defnull/bottle/commit ... 3ba65b64f4 eingeschlichen. Danke fürs testen!

Hat jemand eine Idee, wie man für so was anständige unit-tests schriebt?
Bottle: Micro Web Framework + Development Blog
Antworten