Zustand des Python Flask Frameworks
Tags: Python, softwarearchitektur
Kategorie Software Engineering | Keine Kommentare »
Vor nun inzwischen fast 5 Jahren war ich auf der Suche nach einem einfachen Python Framework, um ein Web UI für Administratoren zu entwickeln, die Änderungen in der Datenbank einer Serversoftware vornehmen müssen. Dabei stieß ich auf Flask Admin – ein Plugin für das Flask Framework. Inzwischen habe ich Flask mit seinen diversen Plugins in unterschiedlichen Projekten verwendet. Es folgt ein Überblick und ein Ausblick auf die vermutlich nicht ganz so rosige Zukunft von Flask…
Was ist Flask?
Flask ist ein Python Framework für die Entwicklung des Backends einer Webanwendung. Es ist natürlich nicht das einzige Web Framework für Python. Bekannter ist zum Beispiel Django, was sich sehr stark an Ruby on Rails orientiert. Flask ist leichtgewichtiger und gibt kein konkretes Vorgehen vor. Im Kern kann man:
- REST Endpoints definieren,
- deren Response generieren,
- eine Datenbank über SQLAlchemy anbinden und
- Templates zur Generierung einer Response nutzen.
Der letzte Punkt ist natürlich nur relevant, wenn man eine Webseite ausliefern möchte und diese auf dem Server gerendert werden soll. Diesen Teil von Flask habe ich fast nie verwendet.
Das Minimalbespiel einer Flask Anwendung sieht folgendermaßen aus:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello world!'
Wie die meisten Python Webanwendungen benötigt Flask einen WSGI Server wie µWSGI oder Gunicorn.
Flask Plugins
Der Kern von Flask ist sehr schlank. So kann ich mit Flask zwar ein REST API definieren, aber ich erhalte nicht automatisch eine Swagger aka OpenAPI Dokumentation. Deshalb erweitere ich Flask immer mit einigen Plugins, ohne die das Framework recht nutzlos wäre.
Das Vorgehen zur Einbindung eines Flask Plugins ist immer ähnlich. Zunächst installiere ich das entsprechende Plugin in meiner Python Umgebung, etwa via pip:
pip install flask-PLUGIN
Anschließend instantiiere ich das Plugin mit meinem „app“ Objekt. Das genaue Vorgehen kann je nach Komplexität des Plugins variieren. Oft reicht aber:
import plugin from flask-PLUGIN
app = Flask(__name__)
plugin = Plugin(app)
Die wichtigsten Flask Plugins
Über die Jahre habe ich diverse Plugins ausprobiert. Dies sind Stand Anfang 2021 die gängisten Plugins, um eine sichere REST API mittels Flask zu implementieren:
Plugin | Einsatzzweck | Zustand |
---|---|---|
Flask-RESTX | Typisierung der REST API und Generierung von interaktiver OpenAPI (Swagger) Dokumentation | halbwegs aktuell, aber offene Probleme |
Flask-Login | Authentifizierung für den Zugriff auf REST Endpoints | aktuell |
Flask-Session | serverseitige Speicherung von Sessions, z.B. in Redis, MongoDB oder via SQLAlchemy in Datenbank | tot |
Flask-CORS | CORS Headers definieren, insbesondere wichtig, wenn man lediglich ein REST API bereitstellt | aktuell |
Flask-Talisman | Definition weiterer HTTP Header, insbesondere für Content Security Policy | aktuell |
Flask-Admin | deklarative Erstellung eines Admin UIs für Daten in Datenbanken | aktuell |
Ich habe nicht umsonst die Spalte „Zustand“ angegeben. Einige Plugins werden kaum noch gepflegt bzw. der ursprüngliche Autor reagiert gar nicht mehr auf Anfragen.
Zum Beispiel erstellt das Flask-Session Plugin zuverlässig eine serverseitige Session für jeden Besucher. Allerdings fehlt bei den Varianten mit Speicherung der Session in einer Datenbank die Funktion, alte Sessions zu löschen. Über die Zeit sammeln sich viele Sessions in der Datenbank. Ich als Entwickler muss mich deshalb selbst um eine Funktionalität kümmern, die abgelaufene Sessions aufzuräumt. Das kann man nicht nur leicht vergessen, sondern ist auch nicht unbedingt trivial zu implementieren.
Quo vadis Flask?
Würde ich heute Anfang 2021 nochmal ein neues Projekt mit Flask starten? Vor einem Jahr hätte ich sofort mit JA geantwortet. Jetzt bin ich mir nicht mehr so sicher.
Aktuell bekommt das Python FastAPI Framework sehr viel Aufmerksamkeit. Es ist ein reines REST Framework. FastAPI enthält bereits alle Features, die ich bei Flask über die Plugins aus meiner Tabelle weiter oben hinzugefügt habe.
Noch ein wichtiger Punkt spricht für FastAPI: Von Haus aus ist FastAPI auf asynchrones IO optimiert und unterstützt z.B. WebSockets. Das braucht man sicher nicht in jedem Projekt, aber es entspricht zumindest dem aktuellen Trend.
Andererseits habe ich FastAPI noch in keinem echten Projekt eingesetzt und kann nicht beurteilen, ob es wirklich alles kann, wie beschrieben. Vermutlich würde ich in einem neuen Projekt zumindest erst mal einen Prototypen mit FastAPI bauen und dann eine Entscheidung treffen.