Seite 10 von 30
Verfasst: Mittwoch 30. September 2009, 13:13
von sma
Schreib doch deine Erfahrungen auf. Defnull wird sich bestimmt freuen und die Dokumentation erweitern. Ansonsten finde ich, dass der Quelltext von Bottle noch klein genug ist, dass man dort nachgucken kann, wenn etwas unklar ist. Mehr Tipps und Beispiele wären aber immer gut.
Stefan
Verfasst: Mittwoch 30. September 2009, 18:44
von Dav1d
So, da dass mit bottle und meinem Hoster leider nicht funktioniert, würde ich gerne zu r GoogleAppEngine umsteigen, ich möchte jetzt nur sichgehen dass bottle auf der GoogleAppEngine läuft, bevor ich mich anmelde
ich hoffe ihr könnts mir sagen
mfg
Verfasst: Mittwoch 30. September 2009, 19:54
von jbs
Verfasst: Mittwoch 30. September 2009, 20:19
von Dauerbaustelle
Defnull, ich wollte ein paar Änderungen pushen in meinem Bottle-Fork, aber das hat nicht geklappt, git mag mich nicht ("remote end hung up").
Hier der Diff, der den Fehler mit den Fehlern unter Fapws repariert.
http://paste.pocoo.org/show/142305/
Verfasst: Donnerstag 1. Oktober 2009, 00:06
von Defnull
Dauerbaustelle hat geschrieben:Defnull, ich wollte ein paar Änderungen pushen in meinem Bottle-Fork, aber das hat nicht geklappt, git mag mich nicht ("remote end hung up").
Hier der Diff, der den Fehler mit den Fehlern unter Fapws repariert.
http://paste.pocoo.org/show/142305/
Github zieht gerade auf einen neuen server um und hat noch ein paar Probleme. Das sollte in ein paar Tagen wieder gehen.
Danke für deinen Diff. Aber eigentlich sollte handler (is app is default_app is Bottle.__call__) IMMER eine Liste oder ein Iterable zurück liefern und niemals Strings (Zeile 274-276). Allerdings habe ich aufgrund deiner Beobachtung einen anderen Bug gefunden: Bei einer Exception wird die Fehler-Seite fälschlicher Weise als String zurück gegeben. Das hab ich korrigiert.
Kann es sein, das dein Fehler nur bei Exceptions auf tritt oder durch eine Middelware verursacht wird? Ansonsten kann ich mir nicht erklären, wie der Handler-Callable einen String zurück geben kann.
Sicherheitshalber baue ich deinen Patch trotzdem ein. Wär aber toll, wenn du das noch mal kontrollieren könntest.
Verfasst: Donnerstag 1. Oktober 2009, 00:17
von Defnull
Dav1d hat geschrieben:So, da dass mit bottle und meinem Hoster leider nicht funktioniert, würde ich gerne zu r GoogleAppEngine umsteigen, ich möchte jetzt nur sichgehen dass bottle auf der GoogleAppEngine läuft, bevor ich mich anmelde
ich hoffe ihr könnts mir sagen
Bottle kann AppEngine theoretisch. Ich selbst habe es noch nicht getestet. Allerdings gab es schon zwei Anfragen diesbezüglich und keiner hat sich im Nachhinein beschwert, also gehe ich davon aus, das es wie erwartet funktioniert.
Verfasst: Donnerstag 1. Oktober 2009, 05:12
von nemomuk
@Defnull: und was ist mit meinem Bug? Ich weiß nicht, was du verändert hast, aber bei mir unter Mac geht der Reloader in Kombination mit send_file nicht mehr - es stürzt ab.
Verfasst: Donnerstag 1. Oktober 2009, 06:13
von Dav1d
danke, hätt ich selber draufkommen können
Verfasst: Donnerstag 1. Oktober 2009, 11:43
von Defnull
SchneiderWeisse hat geschrieben:@Defnull: und was ist mit meinem Bug? Ich weiß nicht, was du verändert hast, aber bei mir unter Mac geht der Reloader in Kombination mit send_file nicht mehr - es stürzt ab.
-Fehler irgendwie bei "send_file"- ist leider keine sehr präzise Fehlermeldung. Ich habe neben dem Reloader auch einen Patch für If-Modifies-Since Support in send_file ein gebaut. Da der Reloader sonst überhaupt nix mit send_file zu tun hat, denke ich, das der Fehler dort liegt. Allerdings kann ich ihn nicht reproduzieren. Der folgende Code funktioniert wie erwartet, selbst wenn ich ihn mit 400 Anfragen/Sekunde bombardiere.
Code: Alles auswählen
import bottle
@bottle.route('/')
def index():
bottle.send_file('sendtest.py', './')
bottle.run(reloader=True)
Verfasst: Donnerstag 1. Oktober 2009, 12:07
von Defnull
Auf
http://blog.curiasolutions.com/2009/09/ ... -shootout/ findet man eine nette Übersicht über verschiedene Web Development Plattformen inklusive Benchmarks. Bottle ist auch dabei und schneidet ziemlich gut ab
As you can see, Bottle is very close to bare WSGI as far as speed goes. On a side note, adding a sample template using Bottle’s default templating package didn’t seem to change these numbers at all.
[...]
What was exciting to me about this test was that I found myself looking at a minimal Python framework equipped with a full templating system and ORM [SQLAlchemy] which all performed faster than the PHP+mysqli() test.
Ich freu mich immer noch wie ein Schneekönig über dieses positive Feedback

It made my day

Verfasst: Donnerstag 1. Oktober 2009, 12:20
von snafu
Ich find's ehrlich gesagt beeindruckend, wie schnell dein Projekt bekannt und beliebt geworden ist. Wenn man bedenkt, dass du ursprünglich nur ein bißchen was zum Thema Mikro-Frameworks beitragen wolltest.

Verfasst: Donnerstag 1. Oktober 2009, 12:27
von Dauerbaustelle
Du könntest aber den Code mal aufräumen :P Die run-Funktion ist imho viel zu voll. Und zB. sehen deine Docstrings nicht immer gleich aus, ...
Verfasst: Donnerstag 1. Oktober 2009, 12:47
von stuhlbein
Hallo, ich fang grad damit an, webseiten mithilfe von Bottle zu schreiben (und bin begeistert wie schnell und einfach das ist =D), hab nur leider ein kleines Problem: Beim parsen folgendem skriptes erhalte ich einen typeError:
Code: Alles auswählen
import sys
import os
import time
import bottle
from bottle import route, request, template
@route('/')
def index():
return template('index')
application = bottle.default_app()
Der fehler:
Code: Alles auswählen
Unhandled Exception: TypeError('not all arguments converted during string formatting',)
Und nochmal dasselbe aus Apache's error.log:
Code: Alles auswählen
[Thu Oct 01 13:48:15 2009] [error] [client 127.0.0.1] Unhandled Exception: TypeError('not all arguments converted during string formatting',)
Ich tipp hier einfach mal auf einen Fehler im skript. =/
Verfasst: Donnerstag 1. Oktober 2009, 13:06
von Defnull
Ja Dauerbaustelle, zu viel Lob ist ungesund, ich weis

Ich bin ja schon ruhig
Momentan liegt meine Priorität bei den Reloader- und Mako-Bugs und mehr Test Cases. Bevor die Testabdeckung nicht besser wird, möchte ich auch ungern den Code säubern oder umstrukturieren, weil sich da immer gerne neue Bugs ein schleichen. Mit den Docstrins hast du allerdings recht.
Ich hab mir inzwischen auch einen persönlichen Release Cycle überlegt: Nach der Feature Runde von 0.6 kommt jetzt erst mal eine Bug Smashing Phase. Wenn Bottle 0.6 stabil läuft und genügend Tests da sind, wird fleißig auf geräumt und eventuell neue Features vorbereitet, die dann ins nächste Release kommen (0.7). Gleichzeitig kommt ein Update der Dokumentation. So zwinge ich mich selbst, neue Features erst ein zu bauen, wenn die Alten funktionieren und ausreichend getestet und dokumentiert sind.
Wer übrigens Code bei steuern will, hilft mir am meisten mit GitHub Forks, da ich diese sehr einfach einpflegen und beobachten kann. Patches per Mail sind aber auch OK. Bitte versteht aber, wenn ich neue Features erst einmal hinten an stelle, solange noch Bugs zu zermatschen sind. Test Cases für eure Patches sind übrigens
sehr gerne gesehen

Verfasst: Donnerstag 1. Oktober 2009, 13:10
von Defnull
Jup, da war noch ein Bug in template(), der eine veraltete SimpleTemplate API verwendet hat. Ich sag ja, Bottle hat zu wenig UnitTests >.<
Mach in 10 Minuten mal ein "easy_install -U bottle"
Verfasst: Donnerstag 1. Oktober 2009, 13:47
von stuhlbein
Defnull hat geschrieben:Jup, da war noch ein Bug in template(), der eine veraltete SimpleTemplate API verwendet hat. Ich sag ja, Bottle hat zu wenig UnitTests >.<
Mach in 10 Minuten mal ein "easy_install -U bottle"
Update durchgeführt, aber leider derselbe fehler =/
OT: ich find in der gesamten Doku keine möglichkeit eigene HTTP-Header abzusenden, sprich, sowas wie "Location:
http://foo.bar/baz.html?p=moo" - Ist das einfach nur gut versteckt, oder gibts das (noch) garnicht? ^^
Verfasst: Donnerstag 1. Oktober 2009, 13:59
von Dauerbaustelle
Ich hätte Lust, nur: Was gibts zu tun? Für Testschreiben reicht meine Kenntnis nicht.
Verfasst: Donnerstag 1. Oktober 2009, 14:08
von Defnull
stuhlbein hat geschrieben:Update durchgeführt, aber leider derselbe fehler =/
Versuch mal bitte bottle.debug(True) um komplette Stack Traces zu bekommen. Das grenzt den Fehler besser ein. Kann es sein, das in deinem Template ein Fehler ist? Kannst du mit dein Template mal schicken?
stuhlbein hat geschrieben:Ich find in der gesamten Doku keine möglichkeit eigene HTTP-Header abzusenden, sprich, sowas wie "Location:
http://foo.bar/baz.html?p=moo" - Ist das einfach nur gut versteckt, oder gibts das (noch) garnicht? ^^
Stimmt, das ist noch undokumentiert. Aber es geht:
Code: Alles auswählen
bottle.response.header['Location'] = "http://foo.bar/"
bottle.response.status = 307
# oder besser:
bottle.redirect("http://foo.bar/")
Verfasst: Donnerstag 1. Oktober 2009, 14:13
von Defnull
Dauerbaustelle hat geschrieben:Ich hätte Lust, nur: Was gibts zu tun? Für Testschreiben reicht meine Kenntnis nicht.
Du könntest dich zum Beispiel an den docstrings vergreifen

Oder was zur Dokumentation (
http://github.com/defnull/bottle-homepage) bei tragen. Oder einfach Fehler suchen. Ich selbst verwende nur ein sehr spezielles Layout von Bottle, wenn ich produktiv etwas damit mache (Bottle+SimpleTemplate+Fabws3). Den Cheetah Support habe ich zum Beispiel komplett blind geschrieben und noch kein einziges mal getestet, da ich Cheetah eben nicht so toll finde und in keinem Projekt nutze.
Jede Form von Feedback hilft

Verfasst: Donnerstag 1. Oktober 2009, 14:22
von nemomuk
Mehr als Wiederholen kann ich mich nicht:
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.
und mehr ist dazu auch nicht zu sagen, weil nicht mehr passiert. Irgendwo muss da ein Bug mit send_file sein, der vllt. gar nicht mit dem Reloader zusammenhängt, sondern mit deinem neuen Feature zusammenhängt, das du da eingebaut hast. Ich würde dir gerne eine Fehlermeldung liefern, aber Python stürzt lediglich ab.
Werde mich aber heute Nachmittag direkt mit dem Problem auseinandersetzen und versuchen es zu beheben.