Flask ist ein besonders schlankes Web­frame­work, das für An­fän­ge­rin­nen und Anfänger sowie Profis glei­cher­ma­ßen in­ter­es­sant ist. Flask be­schränkt sich auf das We­sent­li­che und erlaubt die Im­ple­men­tie­rung externer Bi­blio­the­ken.

Python und seine Web­frame­works

Python ist eine der be­lieb­tes­ten Internet-Pro­gram­mier­spra­chen der Welt. Das liegt vor allem am Ansatz, möglichst einfachen und kurzen Code zu verwenden. Der Pro­gram­mier­stil wird dadurch sehr viel über­sicht­li­cher, Feh­ler­quel­len werden minimiert und auch die Lern­erfol­ge bei einem Python-Tutorial stellen sich schnell ein. Die 1991 von Guido van Rossum erfundene Sprache wird heute von einer großen Community unter der Aufsicht der ge­mein­nüt­zi­gen Python Software Foun­da­ti­on wei­ter­ent­wi­ckelt. Sie ist Open Source und platt­form­un­ab­hän­gig. Als dy­na­mi­sche Sprache un­ter­stützt Python u. a. ob­jekt­ori­en­tier­te und funk­tio­na­le Pro­gram­mie­rung sowie Logging und kann als CGI-Script aus­ge­führt werden.

Für die Er­stel­lung und Ent­wick­lung von dy­na­mi­schen Websites und anderen Web­an­wen­dun­gen werden auch für Python ver­schie­de­ne Web­frame­works angeboten. Diese er­leich­tern die Arbeit, da sie Code zur Verfügung stellen und wie­der­ho­len­de Tä­tig­kei­ten merklich ver­ein­fa­chen. Fehler oder Python-Probleme können so vermieden werden und die Web­ser­vices laufen sicherer und schneller. Häufig benötigte Funk­tio­nen können direkt über­nom­men werden und erfordern daher keine ei­gen­stän­di­ge Pro­gram­mie­rung. Zu den be­kann­tes­ten Web­frame­works für Python gehört Django, das als Full-Stack-Lösung im Vergleich Flask vs. Django einen großen Werk­zeug­kof­fer un­ter­schied­li­cher Funk­tio­nen zur Verfügung stellt, dafür aber auch ver­gleichs­wei­se fest­ge­legt und starr ist. Der viel­leicht be­kann­tes­te Ge­gen­ent­wurf dazu ist Flask.

Was ist Flask?

Während Full-Stack-Frame­works wie Django Ent­wick­le­rin­nen und Ent­wick­lern zahl­rei­che eigene Bi­blio­the­ken zur Verfügung stellen, verfolgt Flask Python einen anderen Ansatz. Das Web­frame­work, das der ös­ter­rei­chi­sche Ent­wick­ler Armin Ronacher 2010 erstmals der Öf­fent­lich­keit vor­stell­te, ist aus­drück­lich mi­ni­ma­lis­tisch gehalten und ver­zich­tet auf jeglichen Ballast. Einzig die Template-Engine Jinja und eine Bi­blio­thek namens „Werkzeug“ sind enthalten. Auf Funk­tio­nen, die bereits von anderen Bi­blio­the­ken abgedeckt werden, ver­zich­tet Flask völlig. Statt­des­sen gibt es die Mög­lich­keit, all diese Funk­tio­nen zu in­te­grie­ren. Flask steht unter BSD-Lizenz, ist frei und Open Source. Als Ge­gen­ent­wurf zu Django und anderen Frame­works konnte Flask Python innerhalb kürzester Zeit eine große Fan­ge­mein­de be­geis­tern.

Flask in Python ein­rich­ten und eine Web­an­wen­dung erstellen

Bevor Sie Flask für Python ein­rich­ten können, müssen ein paar Vor­aus­set­zun­gen erfüllt sein. Dazu gehört, dass Sie Python 3 in­stal­liert haben. Sie benötigen außerdem einen Text­edi­tor oder eine IDE und Zugang zum Internet. Außerdem ist es hilfreich, wenn Sie bereits Grund­kennt­nis­se im Bereich Python, Pro­gram­mie­rung, Da­ten­ty­pen und for-Schleifen haben. Flask ist ein guter Aus­gangs­punkt, um die Er­stel­lung von Web­an­wen­dun­gen zu lernen. Das Framework richten Sie fol­gen­der­ma­ßen ein:

  1. Erstellen Sie eine virtuelle Umgebung, um das neue Projekt von Ihren rest­li­chen Python Libraries oder Projekten zu trennen. Ansonsten kann dies zu Problemen mit Ihrem System führen. Der passende Code sieht so aus:
$ python -m venv neuesprojekt
  1. Nun in­stal­lie­ren Sie Flask. Dafür nutzen Sie am besten das Pa­ket­ver­wal­tungs­pro­gramm pip. Der passende Befehl lautet:
$ pip install flask
  1. Um zu über­prü­fen, ob die In­stal­la­ti­on er­folg­reich war, nutzen Sie diesen Befehl:
python -c "import flask; print(flask.__version__)"
  1. Nun können Sie Flask testen und eine einfache Ba­sis­an­wen­dung erstellen. Öffnen Sie dazu in Ihrem Ver­zeich­nis eine Datei. In unserem Beispiel nennen wir sie anfang.py und nutzen nano, um sie auf­zu­ru­fen:
$ nano anfang.py
  1. In diese Datei schreiben Sie nun folgenden Code:
from flask import Flask
app = Flask(__name__)
@app.route ( "/" )
def test ( ):
return "Dies ist ein Test"
  1. Speichern und schließen Sie die Datei.

  2. Mit der Um­ge­bungs­va­ria­ble FLASK_APP zeigen Sie Flask, wo sich die ent­spre­chen­de Datei befindet:

$ export FLASK_APP=anfang
  1. Über FLASK_ENV führen Sie die Datei im Ent­wick­lungs­mo­dus aus:
$ export FLASK_ENV=development
  1. Nun führen Sie die Anwendung aus:
$ flask run

Der Output sieht dann in etwa so aus:

Output
- Serving Flask app "anfang" (lazy loading)
- Environment: development
- Debug mode: on
- Running on [IP-Adresse]/ (Press CTRL+C to quit)
- Restarting with stat
- Debugger is active!
- Debugger PIN [PIN]

Vor- und Nachteile von Flask

Es gibt gute Gründe für die Nutzung von Flask. Ein paar Aspekte sprechen al­ler­dings je nach ge­wünsch­tem Ein­satz­zweck auch dagegen. Aus diesem Grund lohnt ein genauer Blick auf die Vor- und Nachteile des Web­frame­works.

Vorteile

Umfang: Ein schlan­ke­res Framework als Flask Python werden Sie kaum finden. Flask kann sehr schnell in­stal­liert und dann direkt genutzt werden.

Fle­xi­bi­li­tät: Auch die Fle­xi­bi­li­tät, die Flask mit sich bringt, ist her­aus­ra­gend. Sie haben die Mög­lich­keit, jedes Problem in­di­vi­du­ell zu lösen und können genau jene Bi­blio­the­ken im­ple­men­tie­ren, die Sie auch wirklich benötigen. So können Sie jedes Projekt in­di­vi­du­ell angehen.

Lernkurve: Lern­erfol­ge stellen sich bei einem Flask-Tutorial sehr schnell ein. Das Framework ist bewusst einfach aufgebaut, erlaubt Ihnen aber auch die Arbeit an an­spruchs­vol­len Projekten. Flask ist daher eine gute Wahl für Ein­stei­ge­rin­nen und Ein­stei­ger sowie Profis, die an kom­ple­xe­ren Projekten arbeiten.

Open Source: Flask ist frei und Open Source. Daher können Sie das Framework aus­pro­bie­ren und sehen, ob es die richtige Wahl für Ihre Zwecke ist.

Community: Flask hat eine riesige Fan­ge­mein­de, die Neulingen und er­fah­re­ne­ren Ent­wick­le­rin­nen bzw. Ent­wick­lern gerne mit Rat und Tat zur Seite steht. So werden auch Fragen und Probleme schnell be­ant­wor­tet und gelöst.

Nachteile

Umfang: Je nach Ein­satz­zweck kann der mi­ni­ma­lis­ti­sche Umfang auch ein Nachteil sein. Es muss alles zu­sätz­lich im­ple­men­tiert werden, während andere Frame­works deutlich mehr Funk­tio­nen anbieten.

Ab­hän­gig­keit von Dritt­an­bie­tern: Die Ver­wen­dung externer Bi­blio­the­ken ist immer auch eine mögliche Pro­blem­quel­le, diese sind bei Flask aber un­ab­ding­bar.

Ver­ant­wor­tung: Während andere Frame­works die Wartung au­to­ma­tisch durch­füh­ren und mögliche Probleme direkt beheben, liegt diese Ver­ant­wor­tung bei Flask bei den Nut­ze­rin­nen und Nutzern selbst. Das bedeutet ei­ner­seits mehr Kontrolle, bereitet an­de­rer­seits aber auch mehr Arbeit.

Hello-World-Beispiel: Routing, Templates und APIs

Um die grund­le­gen­de Funk­ti­ons­wei­se von Flask besser ken­nen­zu­ler­nen, folgt nun ein kleines Beispiel, das die wich­tigs­ten Grund­kon­zep­te des Web­frame­works ver­an­schau­licht. Wir erstellen dafür eine einfache Web­an­wen­dung, die zeigt, wie Routing, Templates und eine REST-API zusammen funk­tio­nie­ren. Das Beispiel besteht aus zwei Dateien:

  • app.py: Hier befindet sich unser Py­thon­code.
  • templates/hello.html: Diese Datei ist ein Jinja2-Template, um die Website dynamisch an­zu­zei­gen.

Die Datei app.py sieht fol­gen­der­ma­ßen aus:

from flask import Flask, jsonify, render_template, request
app = Flask(__name__)
@app.route("/")
def home():
    return "Hello World!"
@app.route("/greet/<name>")
def greet(name):
    return render_template("hello.html", name=name)
@app.route("/api/square", methods=["GET"])
def square():
    number = request.args.get("number", default=0, type=int)
    result = number ** 2
    return jsonify({"number": number, "square": result})
if __name__ == "__main__":
    app.run(debug=True)
python

Dies ist die Datei hello.html, die als Template fungiert:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Greeting</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
<p>Welcome to Flask with Jinja2 template.</p>
</body>
</html>
html

Mit @app.route de­fi­nie­ren wir ver­schie­de­ne Endpunkte. Dies sind URLs, die der Server be­ant­wor­ten kann. Die Start­sei­te (“/”) zeigt lediglich den Text „Hello World!“. Über einen dy­na­mi­schen Pfad (“/greet/<name>”) können wir eine per­sön­li­che Begrüßung anzeigen. Der Name wird dabei aus der URL über­nom­men und an unser Jinja2-Template übergeben, das ihn in HTML einfügt (siehe den Code aus templates/hello.html).

Zu­sätz­lich de­mons­trie­ren wir, wie man eine kleine REST-API erstellt: Unter dem Endpunkt “/api/square” kann der User eine Zahl als URL-Parameter übergeben und die App gibt das Quadrat der Zahl als JSON-Antwort zurück. Wir sehen also, dass Flask sowohl klas­si­sche Websites als auch API-Endpunkte bedienen kann. Auch dy­na­mi­sche Inhalte lassen sich dank Templates einfach in HTML einbinden, ohne die Seite manuell an­zu­pas­sen.

Hinweis

Natürlich handelt es sich bei diesem Code nur um ein Mi­ni­mal­bei­spiel im Rahmen eines Flask-Tutorials. Es soll vor allem die grund­le­gen­den Konzepte ver­deut­li­chen. In einer echten Anwendung müssten zu­sätz­lich Aspekte wie Feh­ler­be­hand­lung, Si­cher­heit, Da­ten­va­li­die­rung und eine saubere Pro­jekt­struk­tur be­rück­sich­tigt werden, damit die App stabil, zu­ver­läs­sig und wartbar bleibt.

Flask-Er­wei­te­run­gen

Da Flask sehr mi­ni­ma­lis­tisch gehalten ist, sind viele nützliche Features wie Da­ten­bank­an­bin­dung, Au­then­ti­fi­zie­rung oder For­mu­lar­va­li­die­rung nicht in­te­griert. Um diese Funk­tio­nen hin­zu­zu­fü­gen, setzt man auf Flask-Er­wei­te­run­gen, die von der Community ent­wi­ckelt und gepflegt werden. Sie lassen sich einfach in eine Flask-Anwendung in­te­grie­ren und erweitern den Funk­ti­ons­um­fang erheblich, ohne dass man das Framework selbst anpassen muss. So können Ent­wick­le­rin­nen und Ent­wick­ler gezielt die Bausteine auswählen, die sie wirklich benötigen, und ihre App modular aufbauen. Er­wei­te­run­gen folgen in der Regel dem gleichen Muster wie Flask selbst und sind gut do­ku­men­tiert.

Beispiele für wichtige Flask-Er­wei­te­run­gen sind:

  • Flask-SQL­Al­che­my: Eine Er­wei­te­rung für die Da­ten­bank­an­bin­dung. Sie in­te­griert das beliebte SQL­Al­che­my ORM in Flask und er­mög­licht einfaches Arbeiten mit Da­ten­ban­ken über Python-Klassen.
  • Flask-WTF: Diese Ex­ten­si­ons un­ter­stützt die Er­stel­lung und Va­li­die­rung von Web­for­mu­la­ren. Sie bietet Si­cher­heits­fea­tures wie CSRF-Schutz und er­leich­tert das Handling von Be­nut­zer­ein­ga­ben.
  • Flask-Login: Wie der Name schon sagt widmet sich Flask-Login ver­ein­fach­ter Be­nut­zer­ver­wal­tung und Au­then­ti­fi­zie­rung. Die Er­wei­te­rung kümmert sich um Login-Status, Sitzungen und Zu­griffs­schutz für bestimmte Routen.
  • Flask-Migrate: Mit Flask-Migrate erhalten Sie Datenbank-Mi­gra­ti­ons­funk­tio­nen, die Än­de­run­gen an der Da­ten­bank­struk­tur au­to­ma­tisch verwalten. Die Ver­wen­dung ist ideal in Kom­bi­na­ti­on mit Flask-SQL­Al­che­my für struk­tu­rier­te Updates.
  • Flask-RESTful: Diese Extension dient der ver­ein­fach­ten Er­stel­lung von REST-APIs. Sie stellt Res­sour­cen, Routen und HTTP-Methoden wie GET, POST, PUT oder DELETE stan­dar­di­siert bereit.

Pro­jekt­struk­tur und Best-Practices

Bei Flask-Projekten ist es emp­feh­lens­wert, von Anfang an eine klare und struk­tu­rier­te Pro­jekt­orga­ni­sa­ti­on zu wählen. Auch wenn kleine Apps technisch in einer einzigen Datei funk­tio­nie­ren, er­leich­tert eine saubere Struktur die Wartung und Er­wei­te­rung der Anwendung erheblich.

Ty­pi­scher­wei­se legt man für größere Projekte Ver­zeich­nis­se wie templates für HTML-Dateien, static für CSS, Ja­va­Script und Bilder, sowie app oder src für Python-Module an. Innerhalb des App-Ordners können Un­ter­ord­ner für Blue­prints, Models, Forms und Utilities entstehen, um Funk­tio­nen logisch zu trennen. Blue­prints er­mög­li­chen es, ver­schie­de­ne Kom­po­nen­ten der App modular zu gestalten, bei­spiels­wei­se eine Be­nut­zer­ver­wal­tung oder einen Blog.

Best Practices empfehlen außerdem, Kon­fi­gu­ra­ti­ons­wer­te, wie Datenbank-URLs oder geheime Schlüssel, in einer separaten config.py oder über Um­ge­bungs­va­ria­blen zu sichern. Kon­ti­nu­ier­li­ches Logging hilft, Fehler früh­zei­tig zu erkennen und das Verhalten der App nach­zu­voll­zie­hen. Ebenfalls sinnvoll ist der Einsatz von vir­tu­el­len Um­ge­bun­gen, um Ab­hän­gig­kei­ten sauber zu verwalten. Auch Ver­si­ons­kon­trol­le mit Git gehört zu den Stan­dard­prak­ti­ken, um Än­de­run­gen nach­voll­zieh­bar zu machen.

Website mit eigener Domain – MyWebsite Now
Erstellen Sie Ihre eigene Website in wenigen Minuten
  • Pro­fes­sio­nel­le Templates
  • Än­de­run­gen am Design mit nur einem Klick
  • Domain, SSL und E-Mail-Postfach inklusive

Flask: Si­cher­heit und Tests

Si­cher­heit und Tests sind keine op­tio­na­len Extras, sondern zentrale Be­stand­tei­le einer pro­fes­sio­nel­len Flask-Anwendung, weshalb sie in keinem Flask-Tutorial ver­nach­läs­sigt werden sollten. Wer von Anfang an auf Ver­schlüs­se­lung, Input-Va­li­die­rung, sichere Kon­fi­gu­ra­tio­nen und au­to­ma­ti­sier­te Tests achtet, ent­wi­ckelt stabile und sichere Web­an­wen­dun­gen, die sich später pro­blem­los erweitern lassen.

Si­cher­heit in Flask

Aufgrund der mi­ni­ma­lis­ti­schen Struktur von Flask liegt die Ver­ant­wor­tung für die Si­cher­heit der Anwendung bei den Ent­wick­le­rin­nen und Ent­wick­lern. Ein grund­le­gen­der Schutz besteht in der Ver­wen­dung von CSRF-Schutz für Formulare, ins­be­son­de­re bei Be­nut­zer­ein­ga­ben. Hierfür bietet die Er­wei­te­rung Flask-WTF bewährte Me­cha­nis­men.

Pass­wör­ter sollten niemals im Klartext ge­spei­chert werden, sondern immer ver­schlüs­selt oder gehasht. Hierfür eignen sich bei­spiels­wei­se die Bi­blio­the­ken werkzeug.security oder bcrypt. Ebenso wichtig ist die Input-Va­li­die­rung, um SQL-In­jec­tions, XSS-Angriffe oder andere Ma­ni­pu­la­tio­nen zu ver­hin­dern.

Bei Sessions und Cookies sollten die Flags HttpOnly und Secure gesetzt werden, um sensible Daten zu schützen. Kon­fi­gu­ra­tio­nen wie Datenbank-URLs oder API-Schlüssel sollten über Um­ge­bungs­va­ria­blen oder separate Config-Dateien verwaltet werden, statt direkt im Code.

Tests in Flask

Wie in jeder pro­gram­mier­ten Anwendung sind auch in Flasks Tests ent­schei­dend, um die Sta­bi­li­tät der Anwendung si­cher­zu­stel­len. Mit so­ge­nann­ten Unit-Tests werden einzelne Funk­tio­nen isoliert geprüft, während In­te­gra­ti­ons­tests das Zu­sam­men­spiel mehrerer Kom­po­nen­ten testen.

Flask bietet dafür ein ein­ge­bau­tes Test-Client-System, mit dem HTTP-Anfragen simuliert werden können, ohne den Server tat­säch­lich zu starten. So lassen sich Routen, Templates und API-Endpunkte au­to­ma­ti­siert prüfen. Besonders wichtig ist es, re­gel­mä­ßig Testfälle zu schreiben, gerade bei neuen Features, um Re­gres­sio­nen zu vermeiden. In Kom­bi­na­ti­on mit Con­ti­nuous In­te­gra­ti­on sorgt dies dafür, dass die App auch bei Än­de­run­gen zu­ver­läs­sig bleibt.

Zum Hauptmenü