Bottle: Micro Web Framework

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

So habe gerade einen Reloader für Bottle gebaut. Das war bisher das, was mich am meisten gestört hat beim entwickeln von kleinen Webapps mit Bottle.

http://paste.pocoo.org/show/140881/

verändert habe ich nur die run-function, der Rest ist unverändert (bis auf die zusätzlichen Ergänzungen.

Soweit ich das getestet habe, funktioniert alles einwandfrei.

EDIT: habe noch eine kleine Änderung gemacht,...
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Sehr cool! Ich werde mir das morgen mal genauer an sehen und in Bottle fest einbauen, wenn das möglich ist.
Bottle: Micro Web Framework + Development Blog
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ja, also ich habe es so in Bottle eingebaut und es funktioniert. Du darfst es aber gerne noch etwas anpassen oder kommentieren.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Reloader <- Cool. Habe gestern Abend einen Kurzvortrag über Bottle gehalten und da war es total lästig, nach jeder kleinen Änderung den Server neu starten zu müssen.

Stefan
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

gleich noch ein kleines Update und Bugfix: http://paste.pocoo.org/show/140959/
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Der auto-uploader code von SchneiderWeisse ist im GitHub repository und funktioniert prima! Er ist noch disabled-by-default, weil er ein paar Seiteneffekte bei vorhandenen Projekten haben könnte (schließlich wird der startup- und module-level-code mehrmals aus geführt) wird aber wohl standard (zumindest im debug-modus) sobald ich ihn ausgiebig testen konnte. Ein nächster Schritt wäre der reload-support für Templates, aber das sollte eh recht einfach sein.

Danke an dieser Stelle an SchneiderWeisse. Auto-Reloading war das meist gefragte Feature seit langem :) Dein Code funktioniert sogar unter Windows (wo fort(), kill() u.s.w. nicht existieren) und ich hätte es nicht besser machen können. Wenn du namentlich auf der Bottle Homepage genannt werden willst, kannst du ihn mir ja vielleicht noch verraten :)
Bottle: Micro Web Framework + Development Blog
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Hallo, keine Ursache!
Allerdings glaube ich, dass hier ein kleiner Fehler ist:

Code: Alles auswählen

for file_path, file_mtime in files.iteritems():
    if not os.path.exists(file_path):
        print "File changed: %s (deleted)" % file_path
        print "Restarting..."
        sys.exit(3)
    if os.stat(file_path).st_mtime > file_mtime:
        print "File changed: %s (modified)" % file_path
        print "Restarting..."
        sys.exit(3)
Es soll ja nicht reloadet werden, wenn die Datei existiert, sondern nur, wenn auch die Datei verändert wurde, oder habe ich da einen Knick in der Optik?

Code: Alles auswählen

for file_path, file_mtime in files.iteritems():
    if not os.path.exists(file_path):
    	if os.stat(file_path).st_mtime > file_mtime:
        	print "File changed: %s (modified)" % file_path
        	print "Restarting..."
        	sys.exit(3)
Der Template-Reloader war, bei mir zumindest, nicht notwendig, da die anscheinend jedes mal neu geladen werden...

EDIT: ja, ich hatte wohl einen Knick in der Optik, das war ja ein not exists...;)
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Ich glaube, du hast das "not" vor "os.path.exists" übersehen? Man könnte aber das zweite if zu einem elif machen, damit es verständlicher wird.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Die ganzen Änderungen von heute waren ein neues (feature) Release wert. Bottle trägt nun die Version 0.6.0!!! Wird Zeit für ein easy_install -U bottle

Bei kritischen apps würde ich allerdings noch auf 0.6.1 warten. Ich bin mir noch nicht 100%ig sicher, ob alles so klappt, wie es soll. Die Tests laufen zwar durch, aber gerade das auto-reloading lässt sich nur sehr schwer mit Unit Tests absichern.
Zuletzt geändert von Defnull am Freitag 25. September 2009, 09:48, insgesamt 1-mal geändert.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Defnull hat geschrieben:Ich bin mir noch nicht 10%ig sicher, ob alles so klappt, wie es soll.
Also zu > 90% sicher, dass es nicht klappt? ;)
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

gibt es eigentlich irgendwo ein Changelog oder sowas wo man sieht, was bei 0.6 neu ist? Habe gerade nichts gefunden...

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

Nicht direkt. Man könnte den Twitter-Feed[1] verfolgen oder sich die changelog[1] des GIT Repositories anschauen.

[1] https://twitter.com/bottlepy
[2] http://github.com/defnull/bottle/commits/master

Ich kanns dir aber auch verraten: Experimental auto-reloading support. Disabled by default. Use run(reloader=True) to activate (and test) this feature.
Bottle: Micro Web Framework + Development Blog
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Also, leider habe ich feststellen müssen, dass deine Variante von Bottle mit dem Reloader nicht richtig funktioniert.

Bei mir zumindest stürzt Python ab (verwende einen Mac). Entsprechend des Fehlerberichts von Mac OS X und eigenen Tests liegt der Fehler irgendwie bei "send_file". Mein eigener Reloader - den ich hier gepostet habe - funktioniert hingegen perfekt.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ich fände es auch ganz gut, wenn response eine delete_cookie-Methode hätte...

Code: Alles auswählen

def delete_cookie(key, path='/'):
    self.set_cookie(key=key, value=None, expires=0, max_age=0, path=path)
mpathy
User
Beiträge: 48
Registriert: Montag 17. September 2007, 12:29

Endlich mal ein nettes kleines Webframework, das auch flott zu erfassen ist und man gleich loslegen kann, nen kleines Progrämmchen zu schreiben.

Etwas mehr Doku fände ich trotzdem klasse!

An fehlender Doku scheitern die meisten kleinen Projekte.

Web.py hat zwar ausreichend Doku, aber das mit Bottle besser gefällt, kann ich schonmal sagen!

Und mal ein Beispiel wie sinnvoll und praktisch Decorators angewendet werden können! :)

Viel Erfolg noch!
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Noch ein dringender Feature-Request: eine Art "tidy_up"-Funktion wäre sehr, sehr praktisch,... Das wäre eine Liste an Funktionen, die ausgeführt werden bevor der output an den Server gesendet wird. Sozusagen, um bestimmte Sachen aufzuräumen, als Beispiel könnte man das Schließen einer Datenbank-Session nennen. Es macht wenig Sinn, solche Sachen in jeder view-Funktion extra zu schreiben.

Code: Alles auswählen

class Bottle(object):
    ...
    def __init__(self,....):
        self.closing_functions = []
    ...
    def __call__(self,...):
        ....
        for func in self.closing_functions:
            func()
        return output

Code: Alles auswählen

bottle.add_closing_function(session.close)
Ob das mit Bottle so funktioniert, weiß ich nicht, aber grundsätzlich sollte es so in der Art funktionieren.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Warum benutzt du nicht lieber einen Dekorator? Irgendwelche Funktionen die für jede Route aufgerufen werden finde ich undurchsichtig und unpraktisch. In etwa so:

Code: Alles auswählen

connection = threading.local()

def with_connection(f):
    def inner(*args, **kwargs):
        connnection = setup()
        try:
            return f(*args, **kwargs)
        finally:
            cleanup(connection)
    return inner

@with_connection
@route(...)
def index(...):
    ...
Stefan
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Der Reloader funktioniert bei mir nicht. Er wird zwar gestartet, anscheinend findet er aber keine Dateiänderungen. Ich verwende Fapws.

Ich geh mal debuggen... ;-)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Danke @ sma, das ist eine gute Idee.

Und @ Dauerbaustelle: bei mir funktioniert der Reloader so wie er eingebaut wurde auch nicht.
Stefanxp
User
Beiträge: 5
Registriert: Mittwoch 30. September 2009, 11:11
Kontaktdaten:

Jau gute arbeit.
Wie oben schon erwähnt bissi mehr doku wäre cool gewesen . Ansonsten tops :lol:
Mein Frauen Aufreiss Blog ;) http://www.geilezone.com/
Antworten