Python Language
Servidor HTTP de Python
Buscar..
Ejecutando un servidor HTTP simple
python -m SimpleHTTPServer 9000
python -m http.server 9000
La ejecución de este comando sirve los archivos del directorio actual en el puerto 9000
.
Si no se proporciona ningún argumento como número de puerto, el servidor se ejecutará en el puerto predeterminado 8000
.
El indicador -m
buscará en sys.path
el archivo .py
correspondiente para ejecutarse como un módulo.
Si solo quieres servir en localhost, deberás escribir un programa Python personalizado como:
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()
Archivos de servicio
Suponiendo que tiene el siguiente directorio de archivos:
Puede configurar un servidor web para servir estos archivos de la siguiente manera:
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()
El módulo SocketServer
proporciona las clases y funcionalidades para configurar un servidor de red.
SocketServer
's TCPServer
clase configura un servidor utilizando el protocolo TCP. El constructor acepta una tupla que representa la dirección del servidor (es decir, la dirección IP y el puerto) y la clase que maneja las solicitudes del servidor.
El SimpleHTTPRequestHandler
clase del SimpleHTTPServer
módulo permite a los archivos en el directorio actual para ser servido.
Guarde el script en el mismo directorio y ejecútelo.
Ejecuta el servidor HTTP:
python -m SimpleHTTPServer 8000
python -m http.server 8000
El indicador '-m' buscará 'sys.path' para que el archivo '.py' correspondiente se ejecute como un módulo.
Abra localhost: 8000 en el navegador, le dará lo siguiente:
API programática de SimpleHTTPServer
¿Qué sucede cuando ejecutamos python -m SimpleHTTPServer 9000
?
Para responder a esta pregunta, debemos entender el constructo de SimpleHTTPServer ( https://hg.python.org/cpython/file/2.7/Lib/SimpleHTTPServer.py) y BaseHTTPServer ( https://hg.python.org/cpython/file /2.7/Lib/BaseHTTPServer.py) .
En primer lugar, Python invoca el módulo SimpleHTTPServer
con 9000
como argumento. Ahora observando el código SimpleHTTPServer,
def test(HandlerClass = SimpleHTTPRequestHandler,
ServerClass = BaseHTTPServer.HTTPServer):
BaseHTTPServer.test(HandlerClass, ServerClass)
if __name__ == '__main__':
test()
La función de prueba se invoca después de los controladores de solicitudes y ServerClass. Ahora se invoca 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()
Por lo tanto, aquí se analiza el número de puerto, que el usuario pasó como argumento y está vinculado a la dirección del host. Se llevan a cabo otros pasos básicos de programación de socket con puerto y protocolo dados. Finalmente se inicia el servidor socket.
Esta es una descripción básica de la herencia de la clase SocketServer a otras clases:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
Los enlaces https://hg.python.org/cpython/file/2.7/Lib/BaseHTTPServer.py y https://hg.python.org/cpython/file/2.7/Lib/SocketServer.py son útiles para encontrar más información. información.
Manejo básico de GET, POST, PUT usando 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()
Ejemplo de salida utilizando 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