para - python http server example
¿Cómo ejecutar un servidor http que sirva una ruta específica? (4)
En Python 3.7 https://docs.python.org/3/library/http.server.html#http.server.SimpleHTTPRequestHandler :
import http.server
import socketserver
PORT = 8000
DIRECTORY = "web"
class Handler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=DIRECTORY, **kwargs)
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
y desde la línea de comando:
python -m http.server --directory web
Para volverte un poco loco ... podrías hacer manejadores para directorios arbitrarios:
def handler_from(directory):
def _init(self, *args, **kwargs):
return http.server.SimpleHTTPRequestHandler.__init__(self, *args, directory=self.directory, **kwargs)
return type(f''HandlerFrom<{directory}>'',
(http.server.SimpleHTTPRequestHandler,),
{''__init__'': _init, ''directory'': directory})
with socketserver.TCPServer(("", PORT), handler_from("web")) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
este es mi proyecto de Python3 hiearchy:
projet
/
script.py
web
/
index.html
Desde script.py
, me gustaría ejecutar un servidor http que sirva el contenido de la carpeta web
.
Here se sugiere este código para ejecutar un servidor http simple:
import http.server
import socketserver
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
print("serving at port", PORT)
httpd.serve_forever()
Pero esto en realidad sirve project
, no web
. ¿Cómo puedo especificar la ruta de la carpeta que quiero servir?
Si solo quieres servir el archivo estático, puedes hacerlo ejecutando el módulo SimpleHTTPServer usando python 2:
python -m SimpleHTTPServer
O con python 3:
python3 -m http.server
De esta manera no necesitas escribir ningún script.
Solo para completar, aquí es cómo puede configurar las clases reales del servidor para servir archivos desde un directorio arbitrario:
try
# python 2
from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import HTTPServer as BaseHTTPServer
except ImportError:
# python 3
from http.server import HTTPServer as BaseHTTPServer, SimpleHTTPRequestHandler
class HTTPHandler(SimpleHTTPRequestHandler):
"""This handler uses server.base_path instead of always using os.getcwd()"""
def translate_path(self, path):
path = SimpleHTTPRequestHandler.translate_path(self, path)
relpath = os.path.relpath(path, os.getcwd())
fullpath = os.path.join(self.server.base_path, relpath)
return fullpath
class HTTPServer(BaseHTTPServer):
"""The main server, you pass in base_path which is the path you want to serve requests from"""
def __init__(self, base_path, server_address, RequestHandlerClass=HTTPHandler):
self.base_path = base_path
BaseHTTPServer.__init__(self, server_address, RequestHandlerClass)
Luego puedes establecer cualquier ruta arbitraria en tu código:
web_dir = os.path.join(os.path.dirname(__file__), ''web'')
httpd = HTTPServer(web_dir, ("", 8000))
httpd.serve_forever()
https://docs.python.org/3/library/http.server.html#http.server.SimpleHTTPRequestHandler
Esta clase sirve archivos del directorio actual y más abajo, asignando directamente la estructura del directorio a las solicitudes HTTP.
Entonces, solo necesita cambiar el directorio actual antes de iniciar el servidor - vea os.chdir
p.ej:
import http.server
import socketserver
import os
PORT = 8000
web_dir = os.path.join(os.path.dirname(__file__), ''web'')
os.chdir(web_dir)
Handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
print("serving at port", PORT)
httpd.serve_forever()