Python Language
Python HTTP Server
Ricerca…
Esecuzione di un semplice server HTTP
python -m SimpleHTTPServer 9000
python -m http.server 9000
L'esecuzione di questo comando serve i file della directory corrente sulla porta 9000
.
Se non viene fornito alcun argomento come numero di porta, il server verrà eseguito sulla porta predefinita 8000
.
Il flag -m
cercherà sys.path
per il corrispondente file .py
da eseguire come modulo.
Se vuoi servire solo su localhost devi scrivere un programma Python personalizzato come:
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()
Servire file
Supponendo di avere la seguente directory di file:
È possibile configurare un server Web per servire questi file come segue:
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()
Il modulo SocketServer
fornisce le classi e le funzionalità per configurare un server di rete.
SocketServer
s' TCPServer
classe imposta un server utilizzando il protocollo TCP. Il costruttore accetta una tupla che rappresenta l'indirizzo del server (cioè l'indirizzo IP e la porta) e la classe che gestisce le richieste del server.
La SimpleHTTPRequestHandler
classe del SimpleHTTPServer
modulo consente i file nella directory corrente per essere servito.
Salva lo script nella stessa directory ed eseguilo.
Esegui il server HTTP:
python -m SimpleHTTPServer 8000
python -m http.server 8000
Il flag '-m' cercherà 'sys.path' per il corrispondente file '.py' da eseguire come modulo.
Apri localhost: 8000 nel browser, ti darà quanto segue:
API programmatica di SimpleHTTPServer
Cosa succede quando eseguiamo python -m SimpleHTTPServer 9000
?
Per rispondere a questa domanda dovremmo capire il costrutto di SimpleHTTerver ( https://hg.python.org/cpython/file/2.7/Lib/SimpleHTTerver.py) e BaseHTTerver ( https://hg.python.org/cpython/file /2.7/Lib/BaseHTTerver.py) .
In primo luogo, Python richiama il modulo SimpleHTTPServer
con 9000
come argomento. Ora osservando il codice SimpleHTTerver,
def test(HandlerClass = SimpleHTTPRequestHandler,
ServerClass = BaseHTTPServer.HTTPServer):
BaseHTTPServer.test(HandlerClass, ServerClass)
if __name__ == '__main__':
test()
La funzione di test è invocata dopo i gestori di richieste e ServerClass. Ora viene chiamato BaseHTTerver.test
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()
Quindi qui il numero di porta, che l'utente ha passato come argomento viene analizzato ed è associato all'indirizzo host. Vengono eseguiti ulteriori passaggi di base per la programmazione dei socket con data porta e protocollo. Finalmente viene avviato il socket server.
Questa è una panoramica di base dell'ereditarietà della classe SocketServer in altre classi:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
I link https://hg.python.org/cpython/file/2.7/Lib/BaseHTTerver.py e https://hg.python.org/cpython/file/2.7/Lib/SocketServer.py sono utili per trovare ulteriori informazione.
Gestione di base di GET, POST, PUT utilizzando 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()
Esempio di output usando 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