Seite 15 von 30

Verfasst: Donnerstag 10. Dezember 2009, 18:18
von frabron
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.

Verfasst: Donnerstag 10. Dezember 2009, 19:11
von Defnull
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)

Verfasst: Donnerstag 10. Dezember 2009, 23:06
von apollo13
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 ;))

Verfasst: Freitag 11. Dezember 2009, 08:37
von frabron
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

Verfasst: Samstag 12. Dezember 2009, 16:31
von nemomuk
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'

Verfasst: Samstag 12. Dezember 2009, 18:52
von Defnull
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

Verfasst: Mittwoch 16. Dezember 2009, 22:03
von noisefloor
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

Verfasst: Mittwoch 16. Dezember 2009, 22:29
von Defnull
Was macht das [0] da?

Verfasst: Donnerstag 17. Dezember 2009, 08:23
von noisefloor
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

Verfasst: Dienstag 22. Dezember 2009, 15:18
von Dauerbaustelle
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

Verfasst: Mittwoch 23. Dezember 2009, 17:39
von Karl
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 ;)

Verfasst: Mittwoch 23. Dezember 2009, 17:58
von DasIch
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.

Verfasst: Donnerstag 24. Dezember 2009, 10:58
von noisefloor
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

Verfasst: Donnerstag 24. Dezember 2009, 13:32
von Defnull
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 ;)

Verfasst: Donnerstag 24. Dezember 2009, 13:37
von sma
Karl hat geschrieben:2. Weiß zufällig jemand, auf welchen Freehostern Python installiert ist, falls es sowas überhaupt gibt?
Google App Engine.

Frohe Weihnachten

Verfasst: Donnerstag 31. Dezember 2009, 22:00
von snafu
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... :)

Verfasst: Samstag 2. Januar 2010, 12:24
von Dav1d
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

Verfasst: Samstag 2. Januar 2010, 13:47
von jbs

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?

Verfasst: Samstag 2. Januar 2010, 14:02
von Dav1d
ja.

Es kommt dann imer der Fehler Datei nicht gefunden

Verfasst: Samstag 2. Januar 2010, 14:20
von Dauerbaustelle
Dann existiert die Datei wohl an dem Pfad nicht ;)

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