pythonpython-3.xsimplehttpserver

How to run a http server which serves a specific path?


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?


Solution

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