Seite 9 von 30
Verfasst: Montag 21. September 2009, 22:17
von nemomuk
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,...
Verfasst: Dienstag 22. September 2009, 00:05
von Defnull
Sehr cool! Ich werde mir das morgen mal genauer an sehen und in Bottle fest einbauen, wenn das möglich ist.
Verfasst: Dienstag 22. September 2009, 05:08
von nemomuk
Ja, also ich habe es so in Bottle eingebaut und es funktioniert. Du darfst es aber gerne noch etwas anpassen oder kommentieren.
Verfasst: Dienstag 22. September 2009, 13:37
von sma
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
Verfasst: Dienstag 22. September 2009, 13:46
von nemomuk
gleich noch ein kleines Update und Bugfix:
http://paste.pocoo.org/show/140959/
Verfasst: Donnerstag 24. September 2009, 14:43
von Defnull
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

Verfasst: Donnerstag 24. September 2009, 18:47
von nemomuk
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...

Verfasst: Donnerstag 24. September 2009, 18:55
von Defnull
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.
Verfasst: Donnerstag 24. September 2009, 19:11
von Defnull
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.
Verfasst: Freitag 25. September 2009, 08:16
von mkesper
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?

Verfasst: Freitag 25. September 2009, 19:45
von noisefloor
Hallo,
gibt es eigentlich irgendwo ein Changelog oder sowas wo man sieht, was bei 0.6 neu ist? Habe gerade nichts gefunden...
Gruß, noisefloor
Verfasst: Freitag 25. September 2009, 19:50
von Defnull
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.
Verfasst: Samstag 26. September 2009, 14:30
von nemomuk
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.
Verfasst: Samstag 26. September 2009, 18:49
von nemomuk
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)
Verfasst: Sonntag 27. September 2009, 10:12
von mpathy
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!
Verfasst: Sonntag 27. September 2009, 21:35
von nemomuk
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
Ob das mit Bottle so funktioniert, weiß ich nicht, aber grundsätzlich sollte es so in der Art funktionieren.
Verfasst: Montag 28. September 2009, 20:23
von sma
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
Verfasst: Montag 28. September 2009, 20:53
von Dauerbaustelle
Der Reloader funktioniert bei mir nicht. Er wird zwar gestartet, anscheinend findet er aber keine Dateiänderungen. Ich verwende Fapws.
Ich geh mal debuggen... ;-)
Verfasst: Dienstag 29. September 2009, 05:15
von nemomuk
Danke @ sma, das ist eine gute Idee.
Und @ Dauerbaustelle: bei mir funktioniert der Reloader so wie er eingebaut wurde auch nicht.
jut
Verfasst: Mittwoch 30. September 2009, 12:30
von Stefanxp
Jau gute arbeit.
Wie oben schon erwähnt bissi mehr doku wäre cool gewesen . Ansonsten tops
