Seite 2 von 30
Re: Bottle: Micro Web Framework
Verfasst: Montag 6. Juli 2009, 20:27
von kbr
Defnull hat geschrieben:Nach etwa 4 Tagen und unzähligen Tassen Kaffee kann ich euch endlich mein eigenes
Micro Web Framework präsentieren
Sehr schön - ein eigenes kleines Framework schreiben macht Spaß. Kennst Du
bobo schon? Jim Fulton hat es noch einmal neu aufgelegt

Verfasst: Montag 6. Juli 2009, 20:38
von Defnull
OK, der Validator muss warten, heute hab ich erst einmal Support für sehr einfache Templates hinzu gefügt (+150 Zeilen, langsam wird mein 'micro' Framework etwas groß...)
Einen extra-thread dazu gibts
hier
Beispiel:
Code: Alles auswählen
@route('/test')
def template_test():
items = ['Bottle is nice!', 2, 0.09]
render('example', items=items)
Code: Alles auswählen
%header = 'Test Template'
<html>
<head>
<title>{{header.title()}}</title>
</head>
<body>
<h1>{{header.title()}}</h1>
<p>Items in list: {{len(items)}}</p>
<ul>
%for item in items:
<li>
%if isinstance(item, int):
Zahl: {{item}}
%else:
%try:
Other type: ({{type(item).__name__}}) {{repr(item)}}
%except:
Error: Item has no string representation.
%end try-block (yes, you may add comments here)
%end
</li>
%end
</ul>
</body>
</html>
Der Template-Syntax ist extrem simpel:
1) Ein '%' markiert eine Zeile mit Python-Code. Um die richtige Einrückung muss man sich
nicht kümmern. Die wird vom Template Parser automatisch berechnet.
2) Ein '% end' beendet einen Python Block. Das ist notwendig, damit der Parser die Blöcke richtig erkennt.
3) '{{...}}' wird im Text durch den darin enthaltenen Python-Ausdruck ersetzt.
Diese Template-Engine ist zwar recht simpel, kann aber praktisch alles, was Python auch kann und ist extrem schnell dabei. Das Beispiel rendert mit der Bottle-eigenen Engine zwischen 7 und 10 mal schneller als ein vergleichbares Template mit Mako, obwohl Mako von sich selbst behauptet, 'Insanely Fast' zu sein
In den nächsten paar Minuten wird trotzdem ein Wrapper für Mako-Templates dazu kommen. Bottle möchte sich ja nicht aufdrängen, sondern nur gute Alternativen bieten, falls keine externe Template-Engine zur Verfügung steht.
Edit: @kbr Auf den ersten Blick sieht mir bobo etwas
zu minimal aus. Da fehlt einiges an Features, bis es (für mich) wirklich nützlich wird.
Verfasst: Dienstag 7. Juli 2009, 00:47
von Defnull
Verfasst: Donnerstag 9. Juli 2009, 08:33
von snafu
Planst du eigentlich auch eine kleine Datenbankanbindung für die Zukunft?

Verfasst: Donnerstag 9. Juli 2009, 09:25
von Defnull
Eigentlich nicht. Es gibt da sehr gute Angebote (SQLAlchemy, Elixir, ...) und jede hat seine Vor- und Nachteile. Man kann da nie das Richtige machen, da eh jeder seine eigenen Vorstellungen und Vorlieben hat. Außerdem hab ich nur noch 250 Zeilen Platz und ORMs sind extrem komplex. Das wird nix.
Ich werde aber wohl noch eine kleine Key-Value Datenbank einbauen, die man für Sessions, Multi-Process-Persistenz und Caching nutzen kann. Mit anydbm als Persistenz-Layer und Memcache (wenn vorhanden) als cache. Das ist nämlich sehr nützlich und gar nicht mal so trivial für den Anwender selbst zu basteln (trigger db.close() on request exit; create new dbs on demand, open dbs on demand, ...)
Verfasst: Donnerstag 9. Juli 2009, 13:28
von Defnull
So, fertig. Bottle bietet nun persistente key/value Datenbanken an (
siehe doku). Die Version 0.4.6 ist schon im git Repository, aber noch nicht im pypi, da ich noch auf die Antwort von SMA tum Thema Templates warte.
Verfasst: Donnerstag 9. Juli 2009, 14:51
von /me
Defnull hat geschrieben:So, fertig. Bottle bietet nun persistente key/value Datenbanken an (
siehe doku).
Es ist klein, schön und handlich. Achte bitte darauf, dass du nicht anfängst das Projekt zu einem Monster aufzublasen.
Gruß,
Matthias
Verfasst: Donnerstag 9. Juli 2009, 15:12
von Defnull
Ich bleibe unter 1000 Zeilen

Und mir fällt auch gerade kein fehlendes Feature mehr ein. Nun wird nur noch optimiert

Verfasst: Donnerstag 9. Juli 2009, 18:11
von snafu
Vielleicht mache ich ja etwas falsch, aber bei mir führt `from bottle import db` zu einem ImportError. Installiert habe ich deine aktuellste Version mittels `python setup.py install`. Ich würde die Datenbankfähigkeit sehr gerne ausprobieren, da ich noch ganz neu im Bereich der Webframeworks bin und mich die Einfachheit von Bottle ziemlich überzeugt. Werden die Einträge in der Datenbank eigentlich dauerhaft in eine Datei gespeichert oder gilt das immer nur für eine Serversitzung?
Verfasst: Donnerstag 9. Juli 2009, 18:52
von Dauerbaustelle
Das ist garkein Extra-Modul, das DB-Zeug. Jedenfalls gerade nicht.
Verfasst: Donnerstag 9. Juli 2009, 19:04
von Defnull
snafu hat geschrieben:Vielleicht mache ich ja etwas falsch, aber bei mir führt `from bottle import db` zu einem ImportError. Installiert habe ich deine aktuellste Version mittels `python setup.py install`. Ich würde die Datenbankfähigkeit sehr gerne ausprobieren, da ich noch ganz neu im Bereich der Webframeworks bin und mich die Einfachheit von Bottle ziemlich überzeugt. Werden die Einträge in der Datenbank eigentlich dauerhaft in eine Datei gespeichert oder gilt das immer nur für eine Serversitzung?
Hast du Version 0.4.6? (erst heute nachmittag erschienen)
Mach mal ein:
easy_install -U bottle
Dann sollte das gehen.
Code: Alles auswählen
>>> from bottle import db
>>> db
<bottle.BottleDB object at 0x95baf2c>
>>> db.newdb.key1 = "value1"
>>> db.newdb.key1
'value1'
>>> db.save()
Wobei ich grad nen Fehler gefunden habe und 0.4.7 veröffentliche, Moment bitte.
Edit: Done. Der DB-Kram ist aber noch Verbesserungswürdig. Ich lasse BottleBucket z.B. von dict erben, implementiere aber nicht alle Methoden. Das ist alles noch etwas unsauber, aber es funktioniert.
Verfasst: Freitag 10. Juli 2009, 05:23
von snafu
Über easy_install hatte ich noch 0.4.3 drauf, jetzt - laut der Meldung - 0.4.6. Import geht auf jeden Fall, Details probiere ich später aus.

Verfasst: Montag 13. Juli 2009, 18:13
von Defnull
Es gibt noch genau ein Feature, das ich früher oder später noch umsetzen möchte: Umgekehrte routen (Generierung von URLs aus parametrisierten benannten Routen und passenden Parametern).
Ansonsten ist Bottle (was die Features an geht)
fertig!
In den folgenden Tagen werde ich noch ein paar TestCases schreiben und auf Käferjagd gehen. Dann wird nur noch optimiert und 2to3 kompatibel gemacht. Eventuell lasse ich mich davon überzeugen, noch ein paar zusätzliche WSGI-Gateways oder Template Engines mit Adaptern zu versehen, aber eigentlich ist alles wichtige drin.
Damit wandle ich diesen Thread nun offiziell in einen
Bottle Support und Feedback Thread um
Zum Abschluss noch ein paar Links:
GIT Repository
Dokumentation und WIKI
PyPi Eintrag
Verfasst: Montag 13. Juli 2009, 18:47
von cryzed
Hallo Defnull. Ich bin relativ neu und unerfahren was Webframeworks und Web-Programming mit Python angeht. Ehrlich gesagt mit Server-Geschichten allgemein.
Ich habe mir neulich einen vServer gemietet und dort MySQL sowie Apache2 richtig eingerichtet und konfiguriert und hoste jetzt unter cryzed.de meinen Wordpress Blog. Mit einem Virtualhost in der Apache2 config habe ich mir außerdem eine subdomain nach /var/www/minecraft/ geschaltet, eine kleine Wiki für ein Indie Spiel welches ich Spiele und auch einen Server dafür betreibe.
Gibt es eine Möglichtkeit Bottle, oder viel eher Apache2 zu sagen das wenn ich die subdomain minecraft.cryzed.de aufrufe er automatisch den port 8080 (oder einen anders definierten) Port ansprechen soll, so das er auf dem eigenen Webserver von Bottle landet? Ich wollte nämlich nicht gleich den Apache2 und somit auch den MySQL Server aufgeben - ergo meinen Block nur weil ich ein kleines Projekt mit Bottle schreiben/austesten wollte. Ich wäre sehr froh über eine Antwort.
PS: Es wäre klasse falls das mit den Virtualhosts geht wenn mir jemand eine leicht angepasste default-config hier posten könnte, wie gesagt ich bin leider noch ziemlich neu auf den Gebiet habe aber ehrlich gesagt keine Lust mich jetzt 1-2 Stunden mit Apache2 zu beschäftigen bevor ich meine ersten Schritte mit Bottle machen kann, obwohl das wahrscheinlich die intelligentere Lösung wäre - aber wie man sieht gehts auch (fast) ohne lesen - sonst ständ mein Blog nicht

.
Verfasst: Montag 13. Juli 2009, 18:57
von Defnull
Ich nutze selbst lighttpd und kein Apache, aber Onkel Google spuckt mir folgendes aus:
Code: Alles auswählen
<VirtualHost *>
ServerName python.example.com
ProxyPass / http://localhost:8080/ retry=5
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
Verfasst: Montag 13. Juli 2009, 19:14
von cryzed
Vielen, vielen Dank.
EDIT: Funktioniert leider nicht: bottle.cryzed.de. Meine config schaut so aus:
und liegt in /etc/apache2/sites-available unter dem Namen bottle. Danach habe ich /etc/init.d/apache2 restart ausgeführt und es gab keinen Fehler. Direkt nach cryzed.de:8080 kann ich auch nicht verbinden. Ich habe vorher mittels "iptables -A OUTPUT -p tcp --dport 8080 -j ACCEPT" auch sicher gestellt das der Port frei ist. Irgendeine Idee?
EDIT: Mir fehlte der symlink in sites-enabled - Jetzt bekomme ich aber folgenden Fehler:
Forcing reload of web server (apache2)...Syntax error on line 4 of /etc/apache2/sites-enabled/bottle:
Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration
failed!
EDIT: Klasse, Ich musste noch Module (Plugins?) für Apache laden. Meine sites-available/bottle schaut jetzt so aus:
<VirtualHost *>
ServerName bottle.cryzed.de
ProxyPass /
http://localhost:8080/ retry=5
ProxyPassReverse /
http://localhost:8080/
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
und meine httpd.conf:
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
Schaut das so gesund aus?
Verfasst: Montag 13. Juli 2009, 19:54
von Defnull
Sollte klappen. Die Firewall-Regeln kannst du eigentlich wieder raus nehmen, da Apache ja über localhost mit Bottle spricht.
Die richtige run-Zeile wäre
wobei ich früher oder später mal paste installieren würde, damit
Code: Alles auswählen
run(server=bottle.PasteServer, host='localhost', port=8080)
läuft und Bottle multithreaded wird. FCGI wäre natürlich noch besser, aber dafür fehlen noch die Bottle-Adapter. Kommen aber noch

Verfasst: Montag 13. Juli 2009, 21:10
von cryzed
Ein Beispiel für eine größere Seite (z.B eine Clan-Seite oder so etwas in der Art) fände ich echt toll, aber da muss ich wohl noch ein bisschen warten

.
Verfasst: Montag 13. Juli 2009, 21:16
von snafu
Was brauchst du denn für Beispiele? Um die Templates musst du dich schon selber kümmern.
Verfasst: Montag 13. Juli 2009, 22:04
von Leonidas
Defnull hat geschrieben:FCGI wäre natürlich noch besser, aber dafür fehlen noch die Bottle-Adapter. Kommen aber noch

Da brauchts doch nur WSGI, die passenden Adapter bringt flup oder eine andere Adapter-Library doch schon mit.
Achja, und wer ist denn nun dieser Mirco?
