servidor para example python python-3.x simplehttpserver

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