Ab und zu braucht man einen einfachen HTTP-Server, um lokale Webseiten zu testen oder um Dateien freizugeben. Wer keinen eigenen Webserver betreibt oder einen solchen bei einem Hoster laufen hat, kann sich mit einem Handgriff schnell einen solchen starten, ohne mit Apache- oder Nginx-Konfigurationen zu kämpfen.
Für diese Anforderung bietet die eierlegende Wollmilchsau Python eine Lösung in Form des Moduls 'http.server'. Mit einem Kommando lässt sich ein lokaler Webserver starten:
python3 -m http.server 9000
Python bietet die Möglichkeit ein Modul mit dem Parameter '-m' direkt aufzurufen, ohne dafür ein Skript zu schreiben. Optional kann ein Port (im Beispiel: 9000) angegeben werden; ansonsten lauscht der Server auf Port 8000. Das Python Modul 'http.server' verwendet das aktuelle Arbeitsverzeichnis als Web-Root. Daher empfiehlt es sich, den Befehl aus einem bestimmten Verzeichnis heraus zu starten. Hier ein Beispiel: in meinem Verzeichnis 'Dokumente' befinden sich allerlei Test-Dateien, sowie eine 'index.html'.
[ralf@ralf Dokumente]$ ls
acht.txt apostrophe.md demo.html demo.md eins.txt index.html sub test.DAT test.LCK test.pdf
[ralf@ralf Dokumente]$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Ruft man nun im Webbrowser die angegebene Adresse auf, wird die Datei 'index.html' angezeigt:
Sollte die 'index.html' fehlen, erhält man ein Directory Listing:
Diese schnelle und einfache Lösung bietet sich nur für lokale und unkritische Tests an und sollte auf gar keinen Fall für produktive Systeme verwendet werden. Der kleine Webserver kann auch von ausserhalb des LANs erreicht werden, vorausgesetzt man öffnet im Router die IP und den Port. Davon rate ich aus Sicherheitsgründen dringend ab.
Das ist ja nett... Zuhause Netzintern nutze ich Flask. Das lässt sich prima in Scripte einbinden zur z.B. Hausautomatisierung.
https://de.wikipedia.org/wiki/Flask
"Schnell und einfach". Naja. Python ist schon umfangreicher als manche Webserversoftware und lahmarschiger obendrein.
(Bessere, weil performantere Sprachen mit HTTP in der Basis: Racket und Go. Allerdings brauchen beide etwas mehr Code für dasselbe Ergebnis.)
Wenn man für Tests diesen Python-Server nicht gleich für das ganze lokale Netzwerk öffnen will, kann man den Server auch an die lokale Schnittstelle binden:
python3 -m http.server --bind 127.0.0.1 8000