Ricerca…


Esecuzione di un semplice server HTTP

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

inserisci la descrizione dell'immagine qui

È possibile configurare un server Web per servire questi file come segue:

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

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 2.x 2.3

python -m SimpleHTTPServer 8000

Python 3.x 3.0

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:

inserisci la descrizione dell'immagine qui

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow