Zoeken…


Een eenvoudige HTTP-server uitvoeren

Python 2.x 2.3
python -m SimpleHTTPServer 9000
Python 3.x 3.0
python -m http.server 9000

Het uitvoeren van deze opdracht dient de bestanden van de huidige map op poort 9000 .

Als er geen argument wordt opgegeven als poortnummer, wordt de server uitgevoerd op standaardpoort 8000 .

De vlag -m zoekt in sys.path naar het overeenkomstige .py bestand om als module te worden uitgevoerd.

Als je alleen op localhost wilt serveren, moet je een aangepast Python-programma schrijven, zoals:

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()

Dienende bestanden

Ervan uitgaande dat u de volgende map met bestanden hebt:

voer hier de afbeeldingsbeschrijving in

U kunt als volgt een webserver instellen om deze bestanden te presenteren:

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()

De SocketServer module biedt de klassen en functionaliteiten om een netwerkserver in te stellen.

SocketServer klasse van TCPServer stelt een server in met behulp van het TCP-protocol. De constructor accepteert een tuple die het adres van de server weergeeft (dwz het IP-adres en de poort) en de klasse die de serveraanvragen afhandelt.

Met de klasse SimpleHTTPRequestHandler van de SimpleHTTPServer module kunnen de bestanden in de huidige map worden bediend.

Sla het script op in dezelfde map en voer het uit.

Voer de HTTP-server uit:

Python 2.x 2.3

python -m SimpleHTTPServer 8000

Python 3.x 3.0

python -m http.server 8000

De vlag '-m' zal in 'sys.path' zoeken naar het overeenkomstige '.py' bestand om als een module te worden uitgevoerd.

Open localhost: 8000 in de browser, het geeft je het volgende:

voer hier de afbeeldingsbeschrijving in

Programmatische API van SimpleHTTPServer

Wat gebeurt er als we python -m SimpleHTTPServer 9000 ?

Om deze vraag te beantwoorden, moeten we het concept van SimpleHTTPServer ( https://hg.python.org/cpython/file/2.7/Lib/SimpleHTTPServer.py) en BaseHTTPServer ( https://hg.python.org/cpython/file ) begrijpen /2.7/Lib/BaseHTTPServer.py) .

Ten eerste roept Python de SimpleHTTPServer module aan met 9000 als argument. Nu de SimpleHTTPServer-code observerend,

def test(HandlerClass = SimpleHTTPRequestHandler,
         ServerClass = BaseHTTPServer.HTTPServer):
    BaseHTTPServer.test(HandlerClass, ServerClass)


if __name__ == '__main__':
    test()

De testfunctie wordt aangeroepen na aanvraaghandlers en ServerClass. Nu wordt BaseHTTPServer.test aangeroepen

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()

Vandaar dat hier het poortnummer, dat de gebruiker als argument heeft doorgegeven, wordt ontleed en is gebonden aan het hostadres. Verdere basisstappen van socketprogrammering met gegeven poort en protocol worden uitgevoerd. Eindelijk wordt socket-server gestart.

Dit is een basisoverzicht van overerving van SocketServer-klasse naar andere klassen:

    +------------+
    | BaseServer |
    +------------+
          |
          v
    +-----------+        +------------------+
    | TCPServer |------->| UnixStreamServer |
    +-----------+        +------------------+
          |
          v
    +-----------+        +--------------------+
    | UDPServer |------->| UnixDatagramServer |
    +-----------+        +--------------------+

De links https://hg.python.org/cpython/file/2.7/Lib/BaseHTTPServer.py en https://hg.python.org/cpython/file/2.7/Lib/SocketServer.py zijn nuttig om verder te zoeken informatie.

Basisbehandeling van GET, POST, PUT met 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()

Voorbeelduitvoer met 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow