[[Vorlage(Getestet, noble, jammy)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Editor:Einen Editor öffnen] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis()]] [[Bild(flask_logo.webp, align=left)]] [https://palletsprojects.com/p/flask/ Flask] {en} ist eine in und für [:Python:] geschriebene Bibliothek (Python-Modul) zum Erstellen von [https://wsgi.readthedocs.io/en/latest/ WSGI-basierten] {en} (Web Server Gateway Interface) Webanwendungen. Flask bezeichnet sich selber als "lightweight" (auf deutsch: leichtgewichtig) und zählt auch zu den "Microframeworks". Es ist in der Tat mit Flask möglich, mit wenigen Zeilen Python-Code eine (einfach) Webanwendung zu schreiben. Flask ermöglicht es aber ebenfalls, komplexere / größere Anwendungen zu schreiben und es gibt eine Vielzahl von [https://pypi.org/search/?c=Framework+%3A%3A+Flask Erweiterungen] {en}. Flask nutzt [https://palletsprojects.com/p/jinja/ Jinja2] {en} als Template-Engine und [https://palletsprojects.com/p/werkzeug/ Werkzeug] {en} für das Routing. Flask stammt ursprünglich vom gleichen Entwickler, der auch Teile des Codes der ersten Versionen von [https://ubuntuusers.de/inyoka/ Inyoka], der Softwareplattform von ubuntuusers.de, beigesteuert hat. = Installation = == aus den Paketquellen = Flask ist in den Ubuntu Paketquellen enthalten und kann über das Paket {{{#!vorlage Paketinstallation python3-flask }}} installiert werden. Allerdings ist die Version nicht die aktuelle, stabile Version, so dass eine Installation über pip gegebenenfalls vorzuziehen ist. == via pip == Die aktuelle, stabile Version von Flask kann mit Hilfe von [:pip:] in einem [:venv:] installiert werden[2]: {{{#!vorlage Befehl pip3 install flask }}} Wer Flask 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 = Flask bzw. dessen Funktionen und Methoden lassen sich in Python über den Aufruf von {{{#!code python from flask import Flask }}} importieren. == Routing - ein einfaches Beispiel == Das folgende Beispielprogramm zeigt kurz die Möglichkeiten von statischen und dynamischen Routen in Flask. Dazu gibt man den Code einfach in einen Editor ein[2] und speichert diesen zum Beispiel als '''webanwendung.py''' ab. {{{#!code python from flask import Flask from markupsafe import escape app = Flask(__name__) @app.route("/statisch") def statisch(): return "

Ich bin eine statische Route

" @app.route("/dynamisch/") def dynamisch(name): return f"

Hallo {escape(name)}, wie geht es dir?

" }}} Gestartet wird die Anwendung, indem man in Terminal in dem Verzeichnis, wo sich die Datei befindet, den Befehl {{{#!vorlage Code flask --app webanwendung run }}} ausführt. Die Anwendung läuft dann auf dem Entwicklungsserver von Flask unter `http://127.0.0.1:5000`. Das Prinzip ist also wie folgt: 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. Routen sind dabei letztendlich die URLs, welche man aufrufen kann. Im obigen Beispiel wären dies z.B. `http://127.0.0.1:5000/statisch` und `http://127.0.0.1:5000/dynamisch/Otto`. Beim Entwickeln einer Anwendung kann es nützlich sein, dem Aufruf zusätzlich die Option `--debug` mit anzugeben. Im Fehlerfall erscheint dann eine detaillierte Ausgabe des [https://flask.palletsprojects.com/en/2.2.x/debugging/ Debuggers] {en} von Flask. == Templates benutzen == Wie in der Einleitung erwähnt bringt Flask die Jinja2 Template Engine mit, mit deren Hilfe sich Templates (auf deutsch: Vorlagen) für z.B. HTML Seiten erstellen lassen. Flask erwartet in der Standardeinstellung, dass die Templates im Verzeichnis '''templates''' liegen, das Verzeichnis ist im selben Verzeichnis wie die Python-Datei, die das Template einbindet. Ein einfaches Template sieht z.B. so aus, zu speichern unter dem Namen '''rechnen.html''': {{{ Templatedemo

Vervielfachen

Die eingegebene Zahl ist {{ zahl }}.

{% if zahl % 2 == 0 %}

Die Zahl ist gerade.

{% else %}

Die Zahl ist ungerade.

{% endif %} {% for faktor in (2, 4, 6) %}

Das {{ faktor }}-fache davon ist {{ zahl * faktor }}.

{% endfor %} }}} Das Template erwartet, dass eine Variable namens `zahl` an das Template übergeben ist. Die Zahl wird dann als erstes ausgegeben, dann geprüft, ob sie gerade oder ungerade ist und zuletzt wird noch das 2, 4 und 6-fache der Zahl ausgegeben. Die Anwendung sieht so aus, zu speichern unter dem Namen '''rechendemo.py''' {{{#!code python from flask import Flask, render_template app = Flask(__name__) @app.route('/rechnen/') def rechnen(zahl): return render_template('rechnen.html', zahl=zahl) }}} 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.html`. Führt man nun den Befehl {{{#!vorlage Code flask --app rechendemo run }}} aus und ruft im Browser die URL `http://127.0.0.1/rechnen/4` auf, erhält man die Ausgabe entsprechend des Templates. == Anbindung an andere Server == Produktiv sollte Flask nie über den eingebauten Entwicklungsserver, sondern über WSGI-Applikationsserver wie [:gunicorn:] oder [:waitress:] betrieben werden. Hinweise dazu findet man in der [https://flask.palletsprojects.com/en/2.2.x/deploying/ Deployment Doku] {en} von Flask. == weitere Funktionen == Flask besitzt natürlich einen deutlich größeren Funktionsumfang als hier gezeigt. Einen vollständigen Überblick erhält man in der sehr ausführlichen [https://flask.palletsprojects.com/ Dokumentation] {en} von Flask. = Links = == intern == * [:Bottle:] - alternatives, minimalistisches Python Webframework * [:Django:] - sehr umfangreiches Python Webframework mit "batteries included" Philosophie == extern == * [https://flask.palletsprojects.com/ Dokumentation] {en} von Flask, sehr ausführlich mit vielen Beispielen * [https://flask.palletsprojects.com/en/2.2.x/tutorial/ Tutorial] {en} zum Erstellen einer umfangreicheren Webapplikation mit Flask * [github:pallets/flask:Github Seite] von Flask * [https://jinja.palletsprojects.com Dokumentation] {en} zur Jinja2 Template Engine * [https://palletsprojects.com/p/quart/ Quart] {en} - asynchrones Webframework, die API ist so gut wie identisch zu Flask * [https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world Flask Megatutorial] {en} - Startseite eines sehr umfangreichen Tutorials zu Flask #tag: Programmierung, Python