Donnerstag, 23. Juni 2011

Ein einfacher HTTP und HTTP/CGI Server mit Python

Es gibt Situation, da braucht man einfach nur mal schnell einen simplen (CGI-fähigen) HTTP-Server - sei es, um z.B. HTML-Seiten oder CGI-Skripte zu testen oder von unterwegs temporär Dateien zum Download freizugeben.

Dazu braucht man keinen kompletten Webserver wie Apache & Co., es reicht auch Python. Der Vorteil ist, dass zumindest so gut wie alle Linux-Distributionen Python an Bord haben, man hat also alles dabei, was man braucht. Beide Serverarten lassen sich übrigens mit Bordmitteln von Python umsetzen, es sind nur Module notwendig, welche in der Standardinstallation enthalten sind.

HTTP-Server

Die schnellste Varianten besteht nur aus einem einzigen Befehl:

python -m SimpleHTTPServer

bzw. für Python 3:

python3 -m http.server

Dabei wird einfach das Python-Modul "SimpleHTTPServer" direkt aufgerufen. Dieses startet dann automatisch einer HTTP-Server, welcher generell (!) erreichbar ist und auf Port 8000 lauscht. Somit ist der Server auch von außen zu erreichen, sofern der Rechner mit dem Internet verbunden ist.
Ausgeliefert werden können alle (und alle heißt wirklich alle!) Dateien, welche im Verzeichnis und allen Unterverzeichnissen liegen, in dem der Befehl ausgeführt wurde. Gibt es in diesem Verzeichnis eine Datei "index.html" so wird diese - wie bei anderen HTTP-Servern auch - standardmäßig ausgeliefert, sofern die die URL des Servers ohne weitere Angaben aufgerufen wird.
Zum Testen kann man den Server nur per Browser auf dem gleichen Rechner über die URL http://localhost:8000 erreichen.

WARNUNG: Wie oben bereits erwähnt, liefert der Server alle Dateien aus, die im gleichen Verzeichnis liegen, vom dem der Aufruf erfolgte, inklusive aller Unterverzeichnissen. Ruft man den Befehl also im Wurzelverzeichnis des Dateisystems auf, so wäre prinzipiell das komplette Dateisystem zum Download "offen"! Daher sollte man immer doppelt prüfen, in welchem Verzeichnis man sich befindet, bevor man den Befehl ausführt! Außerdem ist zu bedenken, dass der Server immer mit den Rechten des Nutzers läuft, der ihn gestartet hat.

CGI-Server

Für einen CGI-fähigen HTTP-Server braucht man ein paar Zeilen mehr Code, da man dem HTTP-Server noch zusätzlich mit einem CGI-fähigen "Requesthandler" versehen muss.
Dies ist aber auch mit vier Zeilen Code möglich:

#!/usr/bin/env python

from BaseHTTPServer import HTTPServer
from CGIHTTPServer import CGIHTTPRequestHandler

serv = HTTPServer(('',8080),CGIHTTPRequestHandler)
serv.serve_forever()

Dies kann man nun z.B. als "mein_server.py" speichern.

Nutzt man Python3, so muss man lediglich die from ... import ... Befehle ändern:

from http.server import HTTPServer, CGIHTTPRequestHandler

CGI-Skripte müssen nun im Unterverzeichnis "/cgi-bin" liegen, welches unmittelbar unterhalb der Serververzeichnisse liegen muss, und die Endung .cgi haben. Außerdem muss unter Linux das Executeable-Bit gesetzt sein, sonst kann das CGI-Skript nicht ausgeführt werden (sondern wird nur zum Downlaod angeboten).
Hat man nun z.B. ein Skript Namens "mein_skript.cgi", wie

#!/usr/bin/env python

print 'Content-Type: text/html'
print                         
print '<h1>Hallo Welt</h1>'

so kann man diese gemäß dem obigen Servercode über http://localhost:8080/mein_skript.cgi aufgerufen werden, nachdem der Server mit

python mein_server.py

gestartet wurde.

WARNUNG: Auch hier gilt, dass alle Verzeichnisse und Dateien, die unterhalb des Aufrufverzeichnisses liegen, über den Server ausgeliefert werden!

Abschließende Worte

Wie man sieht ist es sehr einfach, mit Python Bordmitteln schnell und unkompliziert einen HTTP-Server bzw. CGI-fähigen HTTP-Server zu erstellen. Dabei muss man aber immer im Hinterkopf haben, dass die Server keinerlei Rechteverwaltung kennen, d.h. es sind immer alle Dateien im Serververzeichnis und allen Unterverzeichnissen erreichbar. Des weiteren sind die Server per Voreinstellung immer über das Netzwerk bzw. Internet erreichbar.
Von daher ist vom produktiven Einsatz - zumindest in der hier gezeigten Form - dringend abzuraten. Zumal die Server "single-threaded" sind, d.h. immer nur eine Anfrage gleichzeitig bearbeiten können.
Für Testzwecken bzw. zum lokalen Testen hingegen sind die Server sehr gut geeignet.

Keine Kommentare:

Kommentar posten