this is my Python3 project hiearchy:
projet script.py web index.html
From script.py
, I would like to run a http server which serve the content of the web
folder.
Here is suggested this code to run a simple http server:
import http.server import socketserver PORT = 8000 Handler = http.server.SimpleHTTPRequestHandler httpd = socketserver.TCPServer(("", PORT), Handler) print("serving at port", PORT) httpd.serve_forever()
but this actually serve project
, not web
. How can I specify the path of the folder I want to serve?
Advertisement
Answer
In Python 3.7 SimpleHTTPRequestHandler
can take a directory
argument:
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()
and from the command line:
python -m http.server --directory web
To get a little crazy… you could make handlers for arbitrary directories:
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()