Python Language
Serwer HTTP Python
Szukaj…
Uruchamianie prostego serwera HTTP
python -m SimpleHTTPServer 9000
python -m http.server 9000
Uruchomienie tego polecenia obsługuje pliki bieżącego katalogu na porcie 9000
.
Jeśli nie podano argumentu jako numeru portu, serwer będzie działał na domyślnym porcie 8000
.
Flaga -m
przeszuka sys.path
poszukiwaniu odpowiedniego pliku .py
który ma zostać uruchomiony jako moduł.
Jeśli chcesz obsługiwać tylko na localhost, musisz napisać niestandardowy program w języku Python, taki jak:
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()
Udostępnianie plików
Zakładając, że masz następujący katalog plików:
Możesz skonfigurować serwer WWW do obsługi tych plików w następujący sposób:
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()
Moduł SocketServer
zapewnia klasy i funkcje do konfiguracji serwera sieciowego.
SocketServer
TCPServer
konfiguruje serwer przy użyciu protokołu TCP. Konstruktor akceptuje krotkę reprezentującą adres serwera (tj. Adres IP i port) oraz klasę, która obsługuje żądania serwera.
SimpleHTTPRequestHandler
klasa SimpleHTTPServer
modułu pozwala pliki w bieżącym katalogu, aby Mu służono.
Zapisz skrypt w tym samym katalogu i uruchom go.
Uruchom serwer HTTP:
python -m SimpleHTTPServer 8000
python -m http.server 8000
Flaga „-m” przeszuka „sys.path” w poszukiwaniu odpowiedniego pliku „.py” do uruchomienia jako moduł.
Otwórz localhost: 8000 w przeglądarce, otrzymasz:
Programowe API SimpleHTTPServer
Co się stanie, gdy uruchomimy python -m SimpleHTTPServer 9000
?
Aby odpowiedzieć na to pytanie, powinniśmy zrozumieć konstrukcję SimpleHTTPServer ( https://hg.python.org/cpython/file/2.7/Lib/SimpleHTTPServer.py) i BaseHTTPServer ( https://hg.python.org/cpython/file /2.7/Lib/BaseHTTPServer.py) .
Po pierwsze, Python wywołuje moduł SimpleHTTPServer
z argumentem 9000
. Teraz obserwując kod SimpleHTTPServer,
def test(HandlerClass = SimpleHTTPRequestHandler,
ServerClass = BaseHTTPServer.HTTPServer):
BaseHTTPServer.test(HandlerClass, ServerClass)
if __name__ == '__main__':
test()
Funkcja testowa jest wywoływana po modułach obsługi żądań i ServerClass. Teraz wywoływany jest BaseHTTPServer.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()
Stąd tutaj numer portu, który użytkownik podał jako argument, jest analizowany i powiązany z adresem hosta. Przeprowadzane są dalsze podstawowe kroki programowania gniazd dla danego portu i protokołu. Wreszcie serwer gniazd jest inicjowany.
To jest podstawowy przegląd dziedziczenia od klasy SocketServer do innych klas:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
Linki https://hg.python.org/cpython/file/2.7/Lib/BaseHTTPServer.py i https://hg.python.org/cpython/file/2.7/Lib/SocketServer.py są przydatne do dalszego wyszukiwania Informacja.
Podstawowa obsługa GET, POST, PUT przy użyciu 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()
Przykładowe dane wyjściowe przy użyciu 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