Sent from Hauptstadt!

ein Blog für den geneigten Leser

Zustand des Python Flask Frameworks

Tags: ,

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:

PluginEinsatzzweckZustand
Flask-RESTXTypisierung der REST API und Generierung von interaktiver OpenAPI (Swagger) Dokumentationhalbwegs aktuell, aber offene Probleme
Flask-LoginAuthentifizierung für den Zugriff auf REST Endpointsaktuell
Flask-Sessionserverseitige Speicherung von Sessions, z.B. in Redis, MongoDB oder via SQLAlchemy in Datenbanktot
Flask-CORSCORS Headers definieren, insbesondere wichtig, wenn man lediglich ein REST API bereitstelltaktuell
Flask-TalismanDefinition weiterer HTTP Header, insbesondere für Content Security Policyaktuell
Flask-Admindeklarative Erstellung eines Admin UIs für Daten in Datenbankenaktuell

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.

Schreiben sie ein Kommentar