Webanwendungen mit Flask

© Igor Klimov, 123RF

Edler Tropfen

Für Python-Webanwendungen gibt es viele Ansätze. Zu den weniger bekannten zählt Flask, das dieser Artikel näher vorstellt.
Obwohl Linux als freie Software kostenlos verfügbar ist, setzen viele beim Unternehmenseinsatz auf Enterprise-Distributionen mit Support. Wo die Stärken der ... (mehr)

Wer sich überlegt, mit Python eine Webanwendung zu programmieren, stößt recht schnell auf Django, das einen ähnlichen Rang in der Python-Welt einnimmt wie Rails in der Ruby-Community. Eine Alternative zu Django ist Flask [1], das seit seiner Entstehung im Jahr 2010 immer populärer wurde.

Django besitzt den Vorteil, dass es mehr oder weniger schon alles mitbringt, was man für viele Webanwendungen braucht: Templates, Datenbankanbindung, User-Authentifizierung und so weiter. Dafür ist es aber auch schwierig, Komponenten wegzulassen oder auszutauschen. Wer es gerne etwas flexibler hat, sollte einen Blick auf Flask werfen. Von Haus aus setzt Flask beim Unterbau auf eine WSGI-Bibliothek namens Werkzeug [2], die vom Flask-Autor Armin Ronacher stammt. Ebenso die Template-Bibliothek Jinja2, die von Flask standardmäßig verwendet wird.

WSGI

WSGI [3] ist eine Spezifikation, die festlegt, wie eine Webserver-Software und eine Webanwendung, die in Python geschrieben sind, miteinander kommunizieren. Das können zum Beispiel der Apache- oder der Nginx-Webserver mithilfe ihrer WSGI-Module oder spezielle WSGI-Webserver wie wie Gunicorn oder uWSGI sein. Für die Entwicklung enthält auch die Flash-Bibiothek einen eigenen Webserver.

Die aktuellste Flask-Version 0.9 erschien im Juli 2012, wann Version 0.10 erscheint, ist noch ungewiss. Flask setzt mindestens Python 2.5 voraus, Python 3 wird derzeit noch nicht unterstützt. Am einfachsten installieren Sie Flask mit Virtualenv, das in einem Verzeichnis eine lokale Version von Python und seinen Modulen pflegt, die anderen Projekten auf einem Server nicht ins Gehege kommen. Virtualenv selbst ist in den meisten Linux-Distributionen vorhanden. Alternativ lässt es sich mit den Python-Paketmanagement-Tools »pip« und »easy_install« installieren.

Die folgenden Befehle legen ein neues Projektverzeichnis an, wechseln in dieses Verzeichnis und lesen die Shell-Variablen ein, die die virtuelle Python-Umgebung bestimmen (Abbildung 1):

virtualenv webprojekt
cd webprojekt
source bin/activate
Abbildung 1: Virtualenv installiert eine Python-Umgebung in einem Verzeichnis. Neu installierte Erweiterungsmodule landen dann dort in einem Unterverzeichnis.

Wieder zurück in die normale Python-Umgebung der Systemebene gelangen Sie mit »deactivate« . Solange Sie sich noch im Virtualenv befinden, was durch das Prompt-Präfix »(webprojekt)« angezeigt wird, können Sie Python-Module installieren, die dann nur im aktuellen Verzeichnisbau landen. Installieren Sie mit »pip install Flask« die Bibliothek, ist sie danach in »webprojekt/lib/python2.7/site-packages/flask« zu finden. Werkzeug und Jinja2 werden dann von Pip mitinstalliert.

Routing

Flask selbst ist kaum mehr als ein Bindeglied, das die WSGI-Schicht und die Template-Bibliothek zusammenhält. Insbesondere kümmert es sich um das sogenannte Routing, das URLs auf Funktionen abbildet. Die Blaupause hierzu stammt vom Ruby-Framework Sinatra [5], das seither in zig Varianten in allen möglichen Programmiersprachen kopiert wurde. Neben Flask ist Bottle ein weiteres Python-Beispiel, um das es in der Admin-Story dieses Heftes geht.

Im Prinzip weist der Programmierer bei Flask-Anwendungen einzelnen URLs mit hilfe von Python-Dekoratoren Funktionen zu, die dann mithilfe von Template einzelne Webseiten rendern. Im einfachsten Fall sieht das so aus:

@app.route('/')
def homepage():
    return "Das ist die Homepage"

Damit das funktioniert, müssen Sie natürlich zu Beginn des Skripts das Flask-Modul importieren. Der Name der Funktion ist an dieser Stelle erst einmal beliebig. Wichtig ist nur, dass die im Dekorator »@app.route« spezifizierte URL »/« mit einer Funktion verknüpft ist. Die komplette minimale Webanwendung ist in Listing 1 zu sehen. Das typische Python-Idiom in Zeile sorgt dafür, dass »app.run()« nur dann abläuft, wenn das Skript vom Interpreter aufgerufen und nicht von einem anderen Modul importiert wird.

Listing 1

Simple Flask-App

 

Bei Pfadnamen sollte man übrigens auf den abschließenden Schrägstrich achten. Schreibt man ihn hin, etwa bei »@app.route("/artikel/")« , funktioniert die URL mit oder ohne ihn. Schreibt man dagegen nur »"/artikel"« , führt ein Aufruf von »http://Server/artikel/« zu einer 404-Fehlermeldung. Wer beim Aufruf einer URL nach dem HTTP-Verb differenzieren möchte, wie man es typischerweise bei REST-Anwendungen tut, kann das mit dem Keyword-Parameter »methods« tun. Die folgende URL lässt sich so nur per POST aufrufen:

@app.route('/login', methods=['POST'])

Per Default läuft der eingebaute Webserver mit der IP-Adresse 127.0.0.1 auf Port 5000. Um das zu ändern, übergeben Sie die Keyword-Parameter »host=IP-Adresse« und »port=Portnummer« der Methode »run()« . Dabei muss man unbedingt darauf achten, die eigene Anwendung nicht über eine im Internet erreichbare Adresse anzubieten, wenn sie im Debug-Mode läuft. Dann ist es nämlich möglich, über den Webbrowser eigene Python-Anweisungen auf dem Server auszuführen!

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019