ubuntuusers.de

Flask

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

flask_logo.webp

Flask 🇬🇧 ist eine in und für Python geschriebene Bibliothek (Python-Modul) zum Erstellen von WSGI-basierten 🇬🇧 (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 Erweiterungen 🇬🇧.

Flask nutzt Jinja2 🇬🇧 als Template-Engine und Werkzeug 🇬🇧 für das Routing. Flask stammt ursprünglich vom gleichen Entwickler, der auch Teile des Codes der ersten Versionen von Inyoka, der Softwareplattform von ubuntuusers.de, beigesteuert hat.

Installation

aus den Paketquellen

Flask ist in den Ubuntu Paketquellen enthalten und kann über das Paket

  • python3-flask

Befehl zum Installieren der Pakete:

sudo apt-get install python3-flask 

Oder mit apturl installieren, Link: apt://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]:

pip3 install flask 

Wer Flask unter Ubuntu 23.04 und neuer außerhalb eines venv installieren möchte, muss pip mit der entsprechenden Option aufrufen.

Nutzung

Flask bzw. dessen Funktionen und Methoden lassen sich in Python über den Aufruf von

1
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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from flask import Flask
from markupsafe import escape


app = Flask(__name__)

@app.route("/statisch")
def statisch():
    return "<p>Ich bin eine statische Route</p>"

@app.route("/dynamisch/<name>")
def dynamisch(name):
    return f"<p>Hallo {escape(name)}, wie geht es dir?</p>"

Gestartet wird die Anwendung, indem man in Terminal in dem Verzeichnis, wo sich die Datei befindet, den Befehl

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() 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 Debuggers 🇬🇧 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:

<!doctype html>
<title>Templatedemo</title>
<h1>Vervielfachen</h1>
<p>Die eingegebene Zahl ist {{ zahl }}.</p>
{% if zahl % 2 == 0 %}
<p>Die Zahl ist gerade.</p>
{% else %}
<p>Die Zahl ist ungerade.</p>
{% endif %}
{% for faktor in (2, 4, 6) %}
<p>Das {{ faktor }}-fache davon ist {{ zahl * faktor }}.</p>
{% 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

1
2
3
4
5
6
7
8
from flask import Flask, render_template


app = Flask(__name__)

@app.route('/rechnen/<int:zahl>')
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

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 Deployment Doku 🇬🇧 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 Dokumentation 🇬🇧 von Flask.

intern

  • Bottle - alternatives, minimalistisches Python Webframework

  • Django - sehr umfangreiches Python Webframework mit "batteries included" Philosophie

extern

  • Dokumentation 🇬🇧 von Flask, sehr ausführlich mit vielen Beispielen

  • Tutorial 🇬🇧 zum Erstellen einer umfangreicheren Webapplikation mit Flask

  • Github Seite von Flask

  • Dokumentation 🇬🇧 zur Jinja2 Template Engine

  • Quart 🇬🇧 - asynchrones Webframework, die API ist so gut wie identisch zu Flask

  • Flask Megatutorial 🇬🇧 - Startseite eines sehr umfangreichen Tutorials zu Flask

Diese Revision wurde am 15. April 2024 18:58 von noisefloor erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Python, Programmierung