Recherche…


Exécution d'un serveur HTTP simple

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

entrer la description de l'image ici

Vous pouvez configurer un serveur Web pour servir ces fichiers comme suit:

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

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

python -m SimpleHTTPServer 8000

Python 3.x 3.0

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:

entrer la description de l'image ici

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow