Python Language
Python-HTTP-Server
Suche…
Einen einfachen HTTP-Server ausführen
python -m SimpleHTTPServer 9000
python -m http.server 9000
Wenn Sie diesen Befehl ausführen, werden die Dateien des aktuellen Verzeichnisses an Port 9000
.
Wenn kein Argument als Portnummer angegeben ist, wird der Server auf dem Standardport 8000
.
Das -m
Flag durchsucht sys.path
nach der entsprechenden .py
Datei, die als Modul ausgeführt werden soll.
Wenn Sie nur auf localhost dienen möchten, müssen Sie ein benutzerdefiniertes Python-Programm schreiben, z.
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
HandlerClass = SimpleHTTPRequestHandler
ServerClass = BaseHTTPServer.HTTPServer
Protocol = "HTTP/1.0"
if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 8000
server_address = ('127.0.0.1', port)
HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
Dateien bereitstellen
Angenommen, Sie haben das folgende Dateiverzeichnis:
Sie können einen Webserver für die Bereitstellung dieser Dateien wie folgt einrichten:
import SimpleHTTPServer
import SocketServer
PORT = 8000
handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("localhost", PORT), handler)
print "Serving files at port {}".format(PORT)
httpd.serve_forever()
import http.server
import socketserver
PORT = 8000
handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), handler)
print("serving at port", PORT)
httpd.serve_forever()
Das SocketServer
Modul stellt die Klassen und Funktionen zum Einrichten eines Netzwerkservers bereit.
SocketServer
-Klasse von TCPServer
richtet einen Server mit dem TCP-Protokoll ein. Der Konstruktor akzeptiert ein Tupel, das die Adresse des Servers (dh die IP-Adresse und den Port) und die Klasse darstellt, die die Serveranforderungen verarbeitet.
Mit der SimpleHTTPRequestHandler
Klasse des SimpleHTTPServer
Moduls können die Dateien im aktuellen Verzeichnis SimpleHTTPServer
werden.
Speichern Sie das Skript im selben Verzeichnis und führen Sie es aus.
Führen Sie den HTTP-Server aus:
python -m SimpleHTTPServer 8000
Python -m http.server 8000
Das '-m' Flag sucht nach 'sys.path' nach der entsprechenden '.py'-Datei, um sie als Modul auszuführen.
Öffnen Sie localhost: 8000 im Browser. Sie erhalten folgende Informationen:
Programmatische API von SimpleHTTPServer
Was passiert, wenn wir python -m SimpleHTTPServer 9000
ausführen?
Um diese Frage zu beantworten, sollten wir das Konstrukt von SimpleHTTPServer ( https://hg.python.org/cpython/file/2.7/Lib/SimpleHTTPServer.py) und BaseHTTPServer ( https://hg.python.org/cpython/file ) verstehen /2.7/Lib/BaseHTTPServer.py) .
Zunächst ruft Python das SimpleHTTPServer
Modul mit 9000
als Argument auf. Nun den SimpleHTTPServer-Code beobachten,
def test(HandlerClass = SimpleHTTPRequestHandler,
ServerClass = BaseHTTPServer.HTTPServer):
BaseHTTPServer.test(HandlerClass, ServerClass)
if __name__ == '__main__':
test()
Die Testfunktion wird nach Anforderungshandlern und ServerClass aufgerufen. Jetzt wird BaseHTTPServer.test aufgerufen
def test(HandlerClass = BaseHTTPRequestHandler,
ServerClass = HTTPServer, protocol="HTTP/1.0"):
"""Test the HTTP request handler class.
This runs an HTTP server on port 8000 (or the first command line
argument).
"""
if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 8000
server_address = ('', port)
HandlerClass.protocol_version = protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
Daher wird hier die Portnummer, die der Benutzer als Argument übergeben hat, analysiert und an die Hostadresse gebunden. Weitere grundlegende Schritte der Socket-Programmierung mit gegebenem Port und Protokoll werden ausgeführt. Schließlich wird der Socket-Server gestartet.
Dies ist eine grundlegende Übersicht über die Vererbung von SocketServer-Klassen an andere Klassen:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
Die Links https://hg.python.org/cpython/file/2.7/Lib/BaseHTTPServer.py und https://hg.python.org/cpython/file/2.7/Lib/SocketServer.py sind hilfreich für die weitere Suche Information.
Grundlegende Handhabung von GET, POST, PUT mit BaseHTTPRequestHandler
# from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer # python2
from http.server import BaseHTTPRequestHandler, HTTPServer # python3
class HandleRequests(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def do_GET(self):
self._set_headers()
self.wfile.write("received get request")
def do_POST(self):
'''Reads post request body'''
self._set_headers()
content_len = int(self.headers.getheader('content-length', 0))
post_body = self.rfile.read(content_len)
self.wfile.write("received post request:<br>{}".format(post_body))
def do_PUT(self):
self.do_POST()
host = ''
port = 80
HTTPServer((host, port), HandleRequests).serve_forever()
Beispielausgabe mit curl
:
$ curl http://localhost/
received get request%
$ curl -X POST http://localhost/
received post request:<br>%
$ curl -X PUT http://localhost/
received post request:<br>%
$ echo 'hello world' | curl --data-binary @- http://localhost/
received post request:<br>hello world