Python simple server for testing complex sites
This is an updated version of an older post, handling deprecations in Python 3.10; also added the Expires header in 2024-09.
Static sites often require a CORS- and AJAX-supporting server to function properly, so it’s helpful to run one locally. This is the script I’ve put together for doing that:
# This was created based on info from various online instructions sites. # First you need to create a cert so that SSL will work. # Generate server.pem with the following command: # openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes # run as follows: # python pyserve.py # in the folder where the web materials are. # Then in your browser, visit: # https://localhost:4443 import http.server import socket import ssl # Not that we're allowing CORS here, because we need to run local sites which # use remote resources. class CORSRequestHandler(http.server.SimpleHTTPRequestHandler): def end_headers(self): self.send_header('Access-Control-Allow-Origin', '*') self.send_header('Access-Control-Allow-Methods', 'GET') self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate') self.send_header('Expires', '0') return super(CORSRequestHandler, self).end_headers() httpd = http.server.HTTPServer(('localhost', 4443), CORSRequestHandler) ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ctx.check_hostname = False ctx.load_cert_chain(certfile='/home/mholmes/scripts/pyserve/server.pem') # with key inside httpd.socket = ctx.wrap_socket(httpd.socket, server_side=True) httpd.serve_forever()
I usually add an alias link in my .bashrc file like this:
alias pyserve='python ~/WorkData/scripts/pyserve/pyserve.py'
so I can just run pyserve
in the folder where the static site is.