Link zu Doug Hellmanns Original Artikel
| Zweck: | Das BaseHTTPServer Modul beinhaltet Klassen, die die Grundlage eines Webservers bilden können. |
| Python: | ab 1.4 |
Der BaseHTTPServer benutzt Klassen des SocketServer zur Bereitstellung der Basisklassen eines Webservers. HTTPServer kann direkt genutzt werden, aber der BaseHTTPRequestHandler ist dazu gedacht, so erweitert zu werden, dass er jede Protokoll-Methode behandelt (GET, POST, etc).
Um eine HTTP Methode in Deiner, eine Anfrage (request), verarbeitenden Klasse zu unterstützen, implementiere eine Methode do_METHOD(), wobei METHOD durch den Namen der HTTP Methode ersetzt werden muss. Zum Beispiel: do_GET(), do_POST(), etc. Aus Konsistenzgründen erwartet die Methode keine Argumente. Alle Parameter des Requests werden durch den BaseHTTPRequestHandler geparst und als Instanzattribute gespeichert, so dass sie leicht abgefragt werden können.
Dieser Beispiel Request Verarbeiter illustriert, wie man eine Antwort (response) dem Client zurückliefert und zeigt einige lokale Attribute, die hilfreich bei der Erstellung der response sein können.
Die Nachricht wird zusammengesetzt und nach self.wfile geschrieben, dem file handle für den Antwort - Socket. Jede Antwort benötigt einen Antwortcode, dieser wird durch self.send_response() gesetzt. Wenn ein Fehlercode benutzt wird (404, 501, etc) wird, sofern keine Nachricht mit dem Fehlercode übergeben wurde, eine passende Fehlernachricht in den Header eingebunden.
Um den request handler eines Servers auszuführen, wird er einfach dem Konstruktor des HTTPServer übergeben, so wie im __main__ Abschnitt des Beispielprogramms.
$ python BaseHTTPServer_GET.py Starte server, drückezum Beenden
Benutze in einem separaten Terminalfenster curl für den Aufruf:
$ curl -i http://localhost:8080/?foo=barHTTP/1.0 200 OK
Server: BaseHTTP/0.3 Python/2.5.1
Date: Sun, 09 Dec 2007 16:00:34 GMT
CLIENT VALUES:
client_address=('127.0.0.1', 51275) (localhost)
command=GET
path=/?foo=bar
real path=/
query=foo=bar
request_version=HTTP/1.1
SERVER VALUES:
server_version=BaseHTTP/0.3
sys_version=Python/2.5.1
protocol_version=HTTP/1.0
Der HTTPServer ist eine einfache Unterklasse des SocketServer.TCPServer und benutzt keine Threads um mehrfache Anfrage abzuarbeiten. Um threading oder forking hinzuzufügen müssen sie eine neue Klasse erzeugen, die die entsprechende mix-in Klasse des SocketServer benutzt.
Jedes mal, wenn eine Anfrage hereinkommt, wird ein neuer Thread erzeugt.
$ curl http://localhost:8080/ Thread-1 $ curl http://localhost:8080/ Thread-2 $ curl http://localhost:8080/ Thread-3
Ein Wechsel vom ThreadingMixIn Server zum ForkingMixIn Server würde unter Verwendung von Prozessen statt Threads zu ähnlichen Ergebnissen führen
Post Anfragen zu Unterstützung erfordert etwas mehr Arbeit, da die Basisklasse die Formulardaten nicht für uns parst. Das cgi Modul stellt die FieldStorage Klasse zur Verfügung, mit der ein Formular geparst werden kann.
Wenn wir wieder curl benutzen, können wir Formulardaten einbinden, welches automatisch POST setzt. Das letzte
Argument -F datafile=@BaseHTTPServer_GET.py, schickt den Inhalt der Datei BaseHTTPServer_GET.py
um zu demonstrieren wie Dateidaten von einem Formular gelesen werden.
$ curl http://localhost:8080/ -F name=dhellmann -F foo=bar -F datafile=@BaseHTTPServer_GET.py
Client: ('127.0.0.1', 51128)
Pfad: /
Formulardaten:
name=dhellmann
foo=bar
Hochgeladen datafile (2222 Bytes)
Die Fehlerverarbeitung wird einem mit send_error() einfach gemacht. Übergebe einfach den passenden Fehlercode und eine optionale Fehlermeldung und die vollständige Antwort (mit Header, Statuscode und body) wird für dich erzeugt.
In diesem Fall wird der Fehlercode 404 zurückgeliefert.
$ curl -i http://localhost:8080/ HTTP/1.0 404 Not Found Server: BaseHTTP/0.3 Python/2.5.1 Date: Sun, 09 Dec 2007 15:49:44 GMT Content-Type: text/html Connection: close <head> <title>Error response</title> </head> <body> <h1>Error response</h1> <p>Error code 404. <p>Message: Not Found. <p>Error code explanation: 404 = Nothing matches the given URI. </body>