[[Vorlage(getestet, noble, jammy, focal)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] }}} [[Inhaltsverzeichnis()]] [[Bild(bottle.png,72,align=left)]] [https://bottlepy.org Bottle] {en} ist eine in und für [:Python:] geschriebene Bibliothek (Python-Modul) zum einfachen und schnellen Erstellen von [https://wsgi.readthedocs.io/en/latest/ WSGI-basierten] {en} ('''W'''eb '''S'''erver '''G'''ateway '''I'''nterface) Webanwendungen. Einige Merkmale von Bottle sind: * besteht nur aus einer einzelnen Datei * hat keine Abhängigkeiten außer Python selber * Funktionen für das Routing - sowohl statisches als auch dynamisches Routing wird unterstützt * Funktionen zum Auslesen von HTML-Formulardaten und dem HTML Header * Funktionen zum Upload von Dateien * Funktionen zum Generieren und Lesen von Cookies * generieren eines HTML Reponse * eigene Vorlagen Sprache "Simple Template" * erweiterbar über [https://bottlepy.org/docs/dev/tutorial.html#plugins Plugins] {en} (ab Version 0.9) = Installation = == Paketquellen == Bottle ist in den Paketquellen enthalten[1]: {{{#!vorlage Paketinstallation python3-bottle, universe }}} Allerdings ist diese Installationsmethode nicht zu empfehlen, da in den Paketquellen nicht unbedingt die aktuelle, stabile Version enthalten ist. == via pip == Die aktuelle, stabile Version von Bottle kann mit Hilfe von [:pip:] in einem [:venv:] installiert werden[2]: {{{#!vorlage Befehl pip3 install bottle }}} Wer Bottle unter Ubuntu 23.04 und neuer außerhalb eines venv installieren möchte, muss pip mit der [:pip/#Installation-durch-pip-erzwingen:entsprechenden] Option aufrufen. = Nutzung = Bottle bzw. dessen Funktionen und Methoden lassen sich in Python über den Aufruf von {{{#!code python import bottle #bzw.: from bottle import ... }}} in den Programmcode laden. == Routing - ein einfaches Beispiel == Das folgende Beispielprogramm zeigt kurz die Möglichkeiten von statischen und dynamischen Routen in Bottle. Dazu gibt man den Code einfach in einen Editor ein[3] und speichert diesen zum Beispiel als '''webanwendung.py''' ab. {{{#!code python from bottle import Bottle, route, debug, run app = Bottle() @app.route('/statisch') def statisch(): return 'Ich bin eine statische Route.' @app.route('/dynamisch/') def dynamisch(name): return f'Hallo {name}, wie geht es dir?' if __name__ == '__main__': run(app, host='localhost', port=8080, debug=True) }}} Nun kann man seine Anwendung wie folgt im Terminal starten[2]: {{{#!vorlage Befehl python3 webanwendung.py }}} Das Prinzip ist wie folgt: Zuerst wird mit `app=Bottle()` ein app-Objekt angelegt, welches den Einstiegspunkt für die Applikation darstellt. Mit Hilfe des `@app.route()` [wikipedia_en:Python_syntax_and_semantics#Decorators:Dekorators] wird die angegebene Route an die folgende Funktion gebunden. Die Funktion wiederum kann beliebigen Python-Code enthalten, welcher letztendlich mit `return` zurückgegeben bzw. vom Browser dargestellt wird. `debug(True)` aktiviert das Debugging und ist besonders bei der Entwicklung hilfreich, sollte bei der finalen Applikation aber wieder deaktiviert werden. `run(app)` startet den eingebauten, einfachen WSGI-Server von Bottle und liefert das app-Objekt aus. Ohne weitere Parameter läuft dieser auf "localhost" und Port 8080, lässt sich aber auch leicht umkonfigurieren: {{{#!code python run(app, host='localhost', port=8080, debug=True) }}} Routen sind dabei letztendlich die URLs, welche man aufrufen kann. Im obigen Beispiel wären dies z.B. `http://localhost:8080/statisch` und `http://localhost:8080/dynamisch/Otto`. Wenn man aktiv am Programm entwickelt, kann `run()` auch mit dem Parameter `reloader` aufgerufen werden, also: {{{#!code python run(app, reloader=True) }}} Damit wird das Programm bei Änderungen automatisch neu geladen, ohne das man den Server manuell stoppen und starten muss. == Simple Template == Im folgenden wird ein einfaches Beispiel für die in Bottle enthaltene Vorlagensprache "Simple Template" gezeigt. Es gibt eine dynamische Route, die einen Integerwert erwartet. Dieser wird an die Funktion rechnen übergeben, diese übergibt die Zahl wiederum als Variable zahl an das Template '''rechnen.tpl'''. {{{#!code python from bottle import Bottle, route, debug, run, template app = Bottle() @app.route('/rechnen/') def rechnen(zahl): return template('rechnen.tpl',zahl=zahl) if __name__ == '__main__': run(app, host='localhost', port=8080, debug=True, reloader=True) }}} Dies erwartet, dass es eine Vorlage '''rechnen.tpl''' gibt, welche entweder im selben Ordner wie das Python-Programm oder im Unterordner '''./views''' liegt. An die Vorlage wird aus der dynamischen Route der Wert für `zahl` übergeben, welcher dann in der Vorlage ebenfalls unter der Variablen `zahl` vorhanden ist. Die Vorlagen-Datei sieht so aus: {{{#!code %#Eine einfache Vorlage mit Simple Template

Vervielfachen

Die eingegebenen Zahl ist {{zahl}}

% if zahl % 2 == 0:

{{zahl}} ist eine gerade Zahl.

%else:

{{zahl}} ist eine ungerade Zahl. %for i in (2,4,6): %vielfach = i*zahl

Das {{i}}-fache davon ist {{vielfach}}.

%end %end

Fertig!

}}} Wie man sieht ist dies eine Mischung aus HTML und Python. Python-Zeilen werden mit dem Prozentzeichen `%` eingeleitet und können grundsätzlich beliebigen, gültigen Python-Code enthalten. Will man Variablen in der Vorlage auch außerhalb der Python-Zeilen nutzen, so müssen diese in doppelte geschweifte Klammern `{{ }}` eingeschlossen werden. Eine Besonderheit ist, dass - anders als in "reinem" Python - Schleifen u.ä. explizit mit `%end` abgeschlossen werden müssen. Neben HTML kann das Template auch beliebigen anderen Code enthalten (z.B. JavaScript), solange der Webbrowser diesen darstellen kann. Eine vollständige Übersicht über Simple Template findet man in der [https://bottlepy.org/docs/dev/stpl.html Dokumentation] {en}. == Anbindung an andere Server == Der eingebaute Server sollte nur zum Entwickeln genutzt werden, nicht für den produktiven Einsatz. Dazu sollte eine mit Bottle erstellte Webapplikation über einen WSGI-Applikationsservern wie z.B.[:Gunicorn:] oder [:waitress:] ausgeliefert werden. Eine ausführliche Beschreibung findet man in der [https://bottlepy.org/docs/dev/deployment.html Anleitung] {en} zu Bottle im Internet. == Weitere Funktionen == Die hier aufgeführten Beispiele zeigen nur einen Teil der Funktionalität von Bottle. Eine komplette Übersicht und Anleitung findet man in der [https://bottlepy.org/docs/dev/index.html Dokumentation] {en} von Bottle. = Alternativen = * [:Flask:] - im direkten Vergleich zu Bottle größer und komplexer, bietet aber auch mehr Möglichkeiten. * [:Django:] - sehr umfangreiches Python Webframework mit "batteries included" Philosophie = Links = * [https://bottlepy.org/docs/stable/api.html API-Referenz] {en} zu Bottle * [https://bottlepy.org/docs/stable/tutorial_app.html Beispielapplikation] {en} zu Bottle * [github:bottlepy/bottle:Github-Seite] von Bottle #tag: Internet, Server, Programmierung, Python