Python Language
Serveur HTTP Python
Recherche…
Exécution d'un serveur HTTP simple
python -m SimpleHTTPServer 9000
python -m http.server 9000
L'exécution de cette commande sert les fichiers du répertoire en cours sur le port 9000
.
Si aucun argument n'est fourni comme numéro de port, le serveur s'exécutera sur le port 8000
par défaut.
L' -m
recherche sys.path
pour le fichier .py
correspondant à exécuter en tant que module.
Si vous souhaitez ne servir que sur localhost, vous devrez écrire un programme Python personnalisé tel que:
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()
Fichiers de service
En supposant que vous ayez le répertoire de fichiers suivant:
Vous pouvez configurer un serveur Web pour servir ces fichiers comme suit:
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()
Le module SocketServer
fournit les classes et les fonctionnalités permettant de configurer un serveur réseau.
SocketServer
de TCPServer
classe met en place un serveur en utilisant le protocole TCP. Le constructeur accepte un tuple représentant l'adresse du serveur (c'est-à-dire l'adresse IP et le port) et la classe qui gère les requêtes du serveur.
La SimpleHTTPRequestHandler
classe du SimpleHTTPServer
module permet les fichiers dans le répertoire en cours à desservir.
Enregistrez le script dans le même répertoire et exécutez-le.
Exécutez le serveur HTTP:
python -m SimpleHTTPServer 8000
python -m http.server 8000
L'indicateur '-m' recherchera 'sys.path' pour le fichier '.py' correspondant à exécuter en tant que module.
Ouvrez localhost: 8000 dans le navigateur, cela vous donnera les informations suivantes:
API programmatique de SimpleHTTPServer
Que se passe-t-il lorsque nous python -m SimpleHTTPServer 9000
?
Pour répondre à cette question, nous devons comprendre la construction de SimpleHTTPServer ( https://hg.python.org/cpython/file/2.7/Lib/SimpleHTTPServer.py) et BaseHTTPServer ( https://hg.python.org/cpython/file /2.7/Lib/BaseHTTPServer.py) .
Tout d'abord, Python appelle le module SimpleHTTPServer
avec 9000
comme argument. En observant maintenant le code SimpleHTTPServer,
def test(HandlerClass = SimpleHTTPRequestHandler,
ServerClass = BaseHTTPServer.HTTPServer):
BaseHTTPServer.test(HandlerClass, ServerClass)
if __name__ == '__main__':
test()
La fonction de test est appelée après les gestionnaires de requêtes et ServerClass. Maintenant, BaseHTTPServer.test est invoqué
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()
D'où le numéro de port, que l'utilisateur a passé en argument est analysé et lié à l'adresse de l'hôte. D'autres étapes de base de la programmation des sockets avec un port et un protocole donnés sont effectuées. Enfin, le serveur de socket est lancé.
Voici un aperçu de base de l'héritage de la classe SocketServer vers d'autres classes:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
Les liens https://hg.python.org/cpython/file/2.7/Lib/BaseHTTPServer.py et https://hg.python.org/cpython/file/2.7/Lib/SocketServer.py sont utiles pour trouver d'autres informations. information.
Gestion de base de GET, POST, PUT en utilisant 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()
Exemple de sortie utilisant 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