Sehr schön - ein eigenes kleines Framework schreiben macht Spaß. Kennst Du bobo schon? Jim Fulton hat es noch einmal neu aufgelegtDefnull hat geschrieben:Nach etwa 4 Tagen und unzähligen Tassen Kaffee kann ich euch endlich mein eigenes Micro Web Framework präsentieren
Bottle: Micro Web Framework
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
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:
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.
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>
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.
Bottle: Micro Web Framework + Development Blog
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Nun wird es offiziell http://pypi.python.org/pypi/bottle
Bottle: Micro Web Framework + Development Blog
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
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, ...)
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, ...)
Bottle: Micro Web Framework + Development Blog
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
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.
Bottle: Micro Web Framework + Development Blog
Es ist klein, schön und handlich. Achte bitte darauf, dass du nicht anfängst das Projekt zu einem Monster aufzublasen.Defnull hat geschrieben:So, fertig. Bottle bietet nun persistente key/value Datenbanken an (siehe doku).
Gruß,
Matthias
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Ich bleibe unter 1000 Zeilen Und mir fällt auch gerade kein fehlendes Feature mehr ein. Nun wird nur noch optimiert
Bottle: Micro Web Framework + Development Blog
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?
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Das ist garkein Extra-Modul, das DB-Zeug. Jedenfalls gerade nicht.
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Hast du Version 0.4.6? (erst heute nachmittag erschienen)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?
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()
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.
Zuletzt geändert von Defnull am Freitag 10. Juli 2009, 10:32, insgesamt 1-mal geändert.
Bottle: Micro Web Framework + Development Blog
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
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
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
Bottle: Micro Web Framework + Development Blog
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 .
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 .
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
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>
Bottle: Micro Web Framework + Development Blog
Vielen, vielen Dank.
EDIT: Funktioniert leider nicht: bottle.cryzed.de. Meine config schaut so aus:
EDIT: Mir fehlte der symlink in sites-enabled - Jetzt bekomme ich aber folgenden Fehler:
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?<VirtualHost *>
ServerName bottle.cryzed.de
ProxyPass / http://localhost:8080/ retry=5
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
EDIT: Mir fehlte der symlink in sites-enabled - Jetzt bekomme ich aber folgenden Fehler:
EDIT: Klasse, Ich musste noch Module (Plugins?) für Apache laden. Meine sites-available/bottle schaut jetzt so aus: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!
und meine httpd.conf:<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>
Schaut das so gesund aus?LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
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
läuft und Bottle multithreaded wird. FCGI wäre natürlich noch besser, aber dafür fehlen noch die Bottle-Adapter. Kommen aber noch
Die richtige run-Zeile wäre
Code: Alles auswählen
bottle.run(host='localhost', port=8080)
Code: Alles auswählen
run(server=bottle.PasteServer, host='localhost', port=8080)
Bottle: Micro Web Framework + Development Blog
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Da brauchts doch nur WSGI, die passenden Adapter bringt flup oder eine andere Adapter-Library doch schon mit.Defnull hat geschrieben:FCGI wäre natürlich noch besser, aber dafür fehlen noch die Bottle-Adapter. Kommen aber noch
Achja, und wer ist denn nun dieser Mirco?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice