pythonpython-3.xhttpserver

Python 3 simple HTTP server with GET functional


I can't find any Python code for the equivalent of

python -m http.server port --bind addr --directory dir

So I need basically a working server class that process at least GET requests. Most of the things I found on Google were either an HTTP server with some special needs or something like that, where you need to code the response behaviour be yourself:

from http.server import BaseHTTPRequestHandler, HTTPServer

def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()

run()

All that I need is a default working skeleton of a Python HTTP server, where you can provide address, port and directory, and it would normally process GET requests.


Solution

  • That's what I ended up with:

    # python -m http.server 8000 --directory ./my_dir
    
    from http.server import HTTPServer as BaseHTTPServer, SimpleHTTPRequestHandler
    import os
    
    
    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)
    
    
    web_dir = os.path.join(os.path.dirname(__file__), 'my_dir')
    httpd = HTTPServer(web_dir, ("", 8000))
    httpd.serve_forever()
    

    A simple HTTP server that handles GET requests with, working with a certain directory.