Bottle: Micro Web Framework

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Benutzeravatar
kbr
User
Beiträge: 1494
Registriert: Mittwoch 15. Oktober 2008, 09:27

Defnull hat geschrieben:Nach etwa 4 Tagen und unzähligen Tassen Kaffee kann ich euch endlich mein eigenes Micro Web Framework präsentieren :D
Sehr schön - ein eigenes kleines Framework schreiben macht Spaß. Kennst Du bobo schon? Jim Fulton hat es noch einmal neu aufgelegt :)
Benutzeravatar
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:

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.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Bottle: Micro Web Framework + Development Blog
Benutzeravatar
snafu
User
Beiträge: 6779
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Planst du eigentlich auch eine kleine Datenbankanbindung für die Zukunft? :)
Benutzeravatar
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, ...)
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
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
Benutzeravatar
/me
User
Beiträge: 3560
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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
Benutzeravatar
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
Benutzeravatar
snafu
User
Beiträge: 6779
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Das ist garkein Extra-Modul, das DB-Zeug. Jedenfalls gerade nicht.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

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.
Zuletzt geändert von Defnull am Freitag 10. Juli 2009, 10:32, insgesamt 1-mal geändert.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
snafu
User
Beiträge: 6779
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ü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. :)
Benutzeravatar
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
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
cryzed
User
Beiträge: 82
Registriert: Samstag 28. März 2009, 15:53

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 :P.
Benutzeravatar
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
Benutzeravatar
cryzed
User
Beiträge: 82
Registriert: Samstag 28. März 2009, 15:53

Vielen, vielen Dank.
EDIT: Funktioniert leider nicht: bottle.cryzed.de. Meine config schaut so aus:
<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>
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?
Benutzeravatar
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

Code: Alles auswählen

bottle.run(host='localhost', port=8080)
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 :)
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
cryzed
User
Beiträge: 82
Registriert: Samstag 28. März 2009, 15:53

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 :(.
Benutzeravatar
snafu
User
Beiträge: 6779
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Was brauchst du denn für Beispiele? Um die Templates musst du dich schon selber kümmern.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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? ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten