Suche…


Einen einfachen HTTP-Server ausführen

Python 2.x 2.3
python -m SimpleHTTPServer 9000
Python 3.x 3.0
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:

Geben Sie hier die Bildbeschreibung ein

Sie können einen Webserver für die Bereitstellung dieser Dateien wie folgt einrichten:

Python 2.x 2.3
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()
Python 3.x 3.0
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 2.x 2.3

python -m SimpleHTTPServer 8000

Python 3.x 3.0

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:

Geben Sie hier die Bildbeschreibung ein

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow