Bottle: Micro Web Framework

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Ich benutze das eingebaute Templating von Bottle. Leider weiss ich nicht, inwieweit man da ein Encoding festlegen kann, auch im Handbuch habe ich da nix gefunden. Morgen schau ich mal in den Source von Bottle, vllt. finde ich ja da was.

In der Doku von Bottle man unter Output Casting was zu Unicode, jedoch habe ich alles als Default gelassen.
Ths default encoding is utf-8, so if that fits your needs, you can simply return unicode or unicode iterables.
und
You can change Bottles default encoding by setting response.content_type to a value containing a charset=... parameter or by changing response.charset directly.
weder response.content_type noch response.charset habe ich verändert. Und ich bin mir nicht einmal sicher, ob das Verändern dieser Werte einen Einfluss auf den Templatemechanismus hat.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

SimpleTemplate arbeitet intern komplett mit Bytestrings, da am Schluss ja auch Bytestrings raus kommen sollen und Template Dateien als Bytestrings vor liegen. Unicode Variablen müssen vor dem einfügen encodiert werden, wenn sie nicht-ASCII-Zeichen enthalten. Das ist nicht schön und definitiv etwas, das ich noch ändern werde, aber momentan geht es nicht anders.

Eine (seeehr dreckigen) hack hätte ich aber:
bottle.SimpleTemplate("abc{{d}}efg").render(d=u'äöüß', str=lambda x: hasattr(x, 'encode') and x.encode('utf-8') or str)
Bottle: Micro Web Framework + Development Blog
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Defnull hat geschrieben: bottle.SimpleTemplate("abc{{d}}efg").render(d=u'äöüß', str=lambda x: hasattr(x, 'encode') and x.encode('utf-8') or str)
nicht ganz, selbst bytestrings haben encode, sinnvoller is nen isinstance(unicode) check, oder überseh ich grad was (ich schiebs auf die uhrzeit ;))
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Alles klar, danke für die Antworten. Der Hack ist mir glaube ich zu "dreckig", den werde ich wohl nicht verwenden, da ich bei weiteren Problemen meinerseits dann nicht genau nachvollziehen kann, warum und wo weitere Probleme entstehen.

Auf 'ne neue Templateengine hab ich aber auch keinen Bock, mal sehen ...

Oder doch?! Nehme jetzt Jinja zur Ausgabe, damit gehts. Das geht schneller als Code zu verbiegen
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

So, habe mal das Basic-Auth unabhängig geschrieben...

Code: Alles auswählen

def basic_auth(users):
    def decorator(func):
        def wrapper(**kargs):
            def access_denied():
                response.add_header('WWW-Authenticate', 'Basic realm="login required"')
                abort(401, "Sorry, access denied.")
            header = request.environ.get('HTTP_AUTHORIZATION')
            if not header:
                return access_denied()
            try:
                info = header.split()
            except ValueError:
                return access_denied()
            try:
                username, password = info[1].decode('base64').split(':')
            except Exception:
                return access_denied()
            if username in users and users[username] == password:
                return func(**kargs)
            else:
                return access_denied()
        return wrapper
    return decorator
    
@route('/admin')
@basic_auth({'uuu':'ppp'})
def admin():
    return 'Access granted'
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Die GitHub-Version von bottle kann inzwischen auch Basic-Auth mit request.auth -> (user, pass)

Die Implementierung sieht so aus:

Code: Alles auswählen

def parse_auth(header):
    try:
        method, data = header.split(None, 1)
        if method.lower() == 'basic':
            name, pwd = base64.b64decode(data).split(':', 1)
            return name, pwd
    except (KeyError, ValueError, TypeError), e:
        return None
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

hat sich irgendwie irgendwas am Template Syntax geändert???

Jedenfalls funktioniert bei mir partout nicht

Code: Alles auswählen

<select name="jahr">
%for jahr in [2009,2008,2007]:
    <option>{{jahr}}</option>
%end
</select>
Die Route, die das Template aufruft sieht so aus:

Code: Alles auswählen

def hauptseite():

    bottle.TEMPLATES.clear()
    ...
    bottle.template('einleitung')[0]
    ...
Das Template wird schon angezeigt, aber halt nur bis zu der for-Schleife. Die erzeugt ein leeres Auswahlfeld, alles danach wird nicht mehr angezeigt...

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

Was macht das [0] da?
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ja ja ja - da ist mir gestern Abend, als der Computer aus war, auch eingefallen :oops: - die [0] ist falsch, weil ja dann nur das 1. Element des Rückgabeliste des Templates genommen wird. Dann muss der Rest des Templates ja zwangsläufig fehlen ;-)

Gruß, noisefloor
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Kann ich eigentlich das Routing-System auch mit Klassen verwenden? Und wenn ja, wie?

Also sowas hätte ich gerne:

Code: Alles auswählen

class Server(...):
  @route('/foo')
  def foo(self):
    pass
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Ich habe Bottle gerade auf meinem Rechner getestet, ich find das Teil klasse :)
Da kann man sich fast überlegen, ob man demnächst auf Python statt PHP setzt.

Noch drei kleine Fragen:
1. Wie gut ist die Performance von Bottle? Kann man das bedenkenlos für kleine bis mittelgroße Projekte einsetzen?
2. Weiß zufällig jemand, auf welchen Freehostern Python installiert ist, falls es sowas überhaupt gibt?
3. Ist soetwas wie ein Tutorial geplant? Sicher kann man das meiste mit Hilfe der Hinweise in der Dokumentation + Eigeninitiative raustüfteln, aber mir würden ein paar ausführlichere Beschreibungen zum einen oder anderen Thema gefallen :) Und ich denke, dass ein Tutorial allgemein auch für die Verbreitung von Bottle von Vorteil wäre.
Mir ist klar, dass das nicht oberste Priorität ist (und auch nicht sein sollte), und das ganze einen gewissen Aufwand mich sich bringt, aber ich wollte ja nur mal Fragen ;)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Karl hat geschrieben:1. Wie gut ist die Performance von Bottle? Kann man das bedenkenlos für kleine bis mittelgroße Projekte einsetzen?
Sicherlich geht dass bedenkenlos. bottle ist nur ein kleiner Layer über WSGI und damit nur einen Hauch langsamer als WSGI direkt zu benutzen.

Die Geschwindigkeit lässt du ohnehin eher bei den Datenbank Querys.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Weiß zufällig jemand, auf welchen Freehostern Python installiert ist, falls es sowas überhaupt gibt?
Habe ich auch schon mal gesucht und quasi nichts vernünftiges gefunden. Aber das ist off-topic - mach doch dafür lieber einen eigenen Thread im passenden Unter-Forum auf. :-)

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

Dauerbaustelle hat geschrieben:Kann ich eigentlich das Routing-System auch mit Klassen verwenden? Und wenn ja, wie?
Ja, es geht mit 0.6.4, aber ich würde es nicht machen. Du musst von bottle.BaseController erben un die Route muss einen '{action}' Platzhalter enthalten. Klassen-Dekoratoren funktionieren aber erst ab Python 2.6. Mit Python 2.5 musst du so etwas wie 'route("/bla/{action}")(MyClass)' benutzen.

Ich würde es deshalb nicht benutzen, weil die API alles Andere als stabil ist und sich demnächst noch ändern konnte. Das gilt übrigens für alle nicht-dokumentierten Funktionen (weswegen sie ja auch nicht dokumentier sind) ;)
Karl hat geschrieben: 1. Wie gut ist die Performance von Bottle? Kann man das bedenkenlos für kleine bis mittelgroße Projekte einsetzen?
Bottle ist (bis auf pures WSGI) meines Wissens das Schnellste, was man auf dem WSGI Sektor bekommen kann. Seth hat dazu auch schon mal ausführliche Benchmarks gemacht (wirklich lesenswert) http://blog.curiasolutions.com/2009/10/ ... d-shinier/
Karl hat geschrieben: 2. Weiß zufällig jemand, auf welchen Freehostern Python installiert ist, falls es sowas überhaupt gibt?
Unter den kostenlosen ist mir keiner bekannt. Es gibt aber schon preiswerte VServer für 12€ im Monat.
Karl hat geschrieben: 3. Ist soetwas wie ein Tutorial geplant? Sicher kann man das meiste mit Hilfe der Hinweise in der Dokumentation + Eigeninitiative raustüfteln, aber mir würden ein paar ausführlichere Beschreibungen zum einen oder anderen Thema gefallen :) Und ich denke, dass ein Tutorial allgemein auch für die Verbreitung von Bottle von Vorteil wäre.
Klar, das weis ich, aber der Schreibaufwand (besonders in Englisch, das ist nicht gerade meine Stärke) ist enorm. Ich hab versucht, die Dokumentation so zu schreiben, das man sie von vorne bis hinten wie ein Tutorial durch arbeiten kann. Eventuell schaffe ich es auch nächstes Jahr, ein Wiki (inklusive ausführlicher Schritt-für-Schritt Anleitung ähnlich pylonshq) zu schreiben. Ansonsten sind Dokumentations-Patches genau so willkommen wie Code-Patches ;)
Bottle: Micro Web Framework + Development Blog
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Karl hat geschrieben:2. Weiß zufällig jemand, auf welchen Freehostern Python installiert ist, falls es sowas überhaupt gibt?
Google App Engine.

Frohe Weihnachten
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Was, so wie ich, vielleicht der ein oder andere noch nicht wusste: http://packages.debian.org/de/sid/python-bottle

Dann denk ich ja mal, Bottle in der nächsten Ubuntu-Version zu finden... :)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ich nutze zur Zeit Bottle mit wsgiref auf meinem PC (ohne Server etc.) und bin gerade dabei mir ein Template zu schreiben, es funktioniert auch, das Problem ist nur wenn ich Bilder oder die CSS-Datei einfügen will, stimmen die Pfade zu den Datein nicht, ich hab das jetzt unschön gelöst. run() startet Bottle ja auf 127.0.0.1:8080, daneben starte ich jetzt noch xampp und meine Datein liegen auf 127.0.0.1/test_template_bottle/, dann funktioniert es auch, kann man das irgendiwie verhindern?

OS: Windows XP
Py: 2.6.2
the more they change the more they stay the same
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

@route('/images/:filename#.*\.png#')
def static_image(filename):
    send_file(filename, root='/path/to/image/files', mimetype='image/png')
Hast du denn sowas gemacht?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

ja.

Es kommt dann imer der Fehler Datei nicht gefunden
the more they change the more they stay the same
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Dann existiert die Datei wohl an dem Pfad nicht ;)

Magst du mal deinen Source (bzw. die Stelle des Sources) posten?
Antworten