Kampis Elektroecke

Ein einfacher Webserver

Raspberry Pi

Zu Anfang zeige ich, wie ein einfacher Webserver mit Flask erstellt werden kann. Das Ziel soll es sein, eine einfache HTML-Webseite zu erstellen und diese anschließend mit Flask zu verwenden. Die Installation des Flask-Paketes kann mit Hilfe von pip durchgeführt werden:

$ pip3 install flask

Anschließend wird ein neues Python-Programm erstellt, die benötigten Methoden importiert und eine neue Flask-Instanz angelegt:

from flask import Flask
from flask import render_template

app = Flask(__name__)

Der Konstruktor erwartet als Parameter den Namen des Paketes welches Flask verwenden soll. In der Regel wird mittels __name__ der Name des Paketes ermittelt und übergeben. 

Damit Flask beim Aufruf einer bestimmten URL die entsprechende Seite aufruft müssen URL-Regeln definiert werden, die bestimmen welche Seite wann geladen wird und welche Daten an die Webseite übergeben werden. Diese URL-Regeln können entweder mittels der Methode add_url_rule des Flask-Objektes oder mittels Decorator erstellt werden. Der Webserver in diesem Beispiel soll nur über eine einzelne Webseite verfügen, die durch den Aufruf der IP-Adresse des Webservers angezeigt wird. Die entsprechende Regel sieht folgendermaßen aus:

@app.route("/")
def GetIndex():
    pass

Oder mittels add_url_rule:

def GetIndex():
    pass
app.add_url_rule("/", "index", GetIndex)

Durch diese Regel ruft der Webserver die Methode GetIndex auf, sobald er eine HTTP-Anfrage für den Index erhält. Bisher hat der Webserver aber noch keine Informationen darüber, was er bei einer eingehenden Anfrage anzeigen soll. Diese Informationen werden nun in der Methode GetIndex bereitgestellt, indem die Methode render_template aufgerufen und das Ergebnis des Aufrufs zurückgegeben wird:

def GetIndex():
    return render_template("index.html")

Die Methode render_template erwartet als Argument mindestens den Namen einer hinterlegten HTML-Vorlage. Diese Vorlage wird geladen. Beim Laden werden ggf. bestimmte Platzhalter ersetzt oder Daten, die zusätzlich über die render_template übergeben werden, in die Vorlage eingefügt. Der Rückgabewert der render_template-Methode ist ein String, der die fertige Webseite im HTML-Format darstellt. In diesem Beispiel soll nur die Vorlage index.html geladen werden. Abschließend wird der Webserver gestartet, indem die run-Methode aufgerufen wird:

app.run(host = "0.0.0.0")

Hinweis:

Soll der Webserver nur lokal auf dem Computer betrieben werden, so muss die IP-Adresse durch 127.0.0.1 ersetzt werden. Wird hingegen die IP-Adresse 0.0.0.0 verwendet, so ist der Webserver auch über das Netzwerk erreichbar.


Das Python-Programm ist damit fertig. Allerdings kann es noch nicht ausgeführt werden, weil noch keine Vorlage für die Webseite index.html hinterlegt ist. Daher würde die Anwendung eine Ausnahme verursachen, wenn versucht wird sich mit dem Webserver zu verbinden.

Sämtliche HTML-Vorlagen werden in einem Verzeichnis namens templates abgelegt, welches sich (per Default) im selben Verzeichnis befinden muss wie das Modul, welches den Webserver startet. Falls Bedarf besteht, kann über das Argument template_folder des Konstruktors kann der Pfad des templates-Verzeichnis geändert werden.

app = Flask(__name__, template_folder = ...)

In dem Verzeichnis templates wird nun eine neue Datei namens index.html angelegt und mit Inhalt gefüllt.

<!DOCTYPE html>
<html>
    <head>
        <link rel = "stylesheet" href = "{{ url_for('static', filename='css/index.css') }}">
        <title>Simple Webserver</title>
    </head>
    <body>
        <header>
            <h1 class = "Title">Simple Webserver with Flask</h1>
        </header>
    </body>
</html>

Die Webseite aus diesem Beispiel verwendet zusätzlich noch ein Stylesheet namens index.css. Solche Stylesheets werden im Verzeichnis static abgelegt, welches sich im selben Verzeichnis wie das Verzeichnis templates befinden muss. Ausgehend vom Verzeichnis static lautet der komplette Pfad für das Stylesheet css/index.css und ist über ein Flask-Makro realisiert worden:

href = "{{ url_for('static', filename='css/index.css') }}"

Dieses Makro fragt beim Aufruf der Vorlage den Pfad für das static-Verzeichnis ab und ergänzt diesen Pfad dann mit dem Dateipfad css/index.css. Das Ergebnis ist der komplette Pfad für das Stylesheet, welcher dann für den Parameter href genutzt wird. Die restlichen Elemente fügen einen Titel und etwas Text in die Webseite ein. Die fertige Webseite wird abschließend gespeichert.

Anschließend wird das Python-Programm gestartet. Es erscheint die folgende Ausgabe im Terminal:

root@Raspberry:/home/pi/Desktop# python3 SimpleWebserver/app.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Jetzt kann auf einem beliebigen Computer im selben Netzwerk wie der Raspberry Pi ein Browser geöffnet, die IP-Adresse des Raspberry Pi eingetragen und die Eingabe mit Enter bestätigt werden. Der Webserver erkennt die einkommende Verbindung und gibt die Anfrage im Terminal aus:

192.168.178.51 - - [10/Sep/2019 18:42:57] "GET / HTTP/1.1" 200 -

Die Webseitenvorlage wird von Flask eingelesen und im Browser angezeigt:

Der fertige Beispielcode kann von meinem Raspberry Pi GitHub-Repository heruntergeladen werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert