#!/usr/bin/python import cgi import mimetypes import os import posixpath import re from mako import exceptions from mako.lookup import TemplateLookup root = "./" port = 8000 lookup = TemplateLookup( directories=[root + "templates", root + "htdocs"], filesystem_checks=True, module_directory="./modules", # even better would be to use 'charset' in start_response output_encoding="ascii", encoding_errors="replace", ) def serve(environ, start_response): """serves requests using the WSGI callable interface.""" fieldstorage = cgi.FieldStorage( fp=environ["wsgi.input"], environ=environ, keep_blank_values=True ) d = dict([(k, getfield(fieldstorage[k])) for k in fieldstorage]) uri = environ.get("PATH_INFO", "/") if not uri: uri = "/index.html" else: uri = re.sub(r"^/$", "/index.html", uri) if re.match(r".*\.html$", uri): try: template = lookup.get_template(uri) except exceptions.TopLevelLookupException: start_response("404 Not Found", []) return [str.encode("Cant find template '%s'" % uri)] start_response("200 OK", [("Content-type", "text/html")]) try: return [template.render(**d)] except: return [exceptions.html_error_template().render()] else: u = re.sub(r"^\/+", "", uri) filename = os.path.join(root, u) if os.path.isfile(filename): start_response("200 OK", [("Content-type", guess_type(uri))]) return [open(filename, "rb").read()] else: start_response("404 Not Found", []) return [str.encode("File not found: '%s'" % filename)] def getfield(f): """convert values from cgi.Field objects to plain values.""" if isinstance(f, list): return [getfield(x) for x in f] else: return f.value extensions_map = mimetypes.types_map.copy() def guess_type(path): """return a mimetype for the given path based on file extension.""" base, ext = posixpath.splitext(path) if ext in extensions_map: return extensions_map[ext] ext = ext.lower() if ext in extensions_map: return extensions_map[ext] else: return "text/html" if __name__ == "__main__": import wsgiref.simple_server server = wsgiref.simple_server.make_server("", port, serve) print("Server listening on port %d" % port) server.serve_forever()