I often find myself wanting to play around with a tiny Python web application with native Python without installing any extra modules - the Python developer’s equivalent of creating an index.html and opening it in the browser just to play around with markup.

For example, today I found myself wanting to inspect how the Google API Client Library for Python handles requests, and a simple application server was all I needed.

In these situations, the following minimal WSGI application, using the built-in wsgiref library is just the ticket:

from wsgiref.simple_server import make_server


def application(env, start_response):
    """
    A basic WSGI application
    """

    http_status = '200 OK'
    response_headers = [('Content-Type', 'text/html')]
    response_text = "Hello World"

    start_response(http_status, response_headers)
    return [response_text]

if __name__ == "__main__":
    make_server('', 8000, application).serve_forever()

Put this in a file - e.g. wsgi.py - and run it with:

$ python wsgi.py
127.0.0.1 - - [14/Feb/2016 16:22:38] "GET / HTTP/1.1" 200 11

(I’ve also saved this as a Gist).

This provides you with a very raw way of parsing HTTP requests. All the HTTP variables come in as items in the env dictionary:

def application(env, start_response):
    env['PATH_INFO']     # The requested path (the `/index.html` in `http://example.com/index.html`),
    env['QUERY_STRING']  # Any query parameters (the `foo=bar` in `http://example.com/index.html?foo=bar`).

What I often do from here is use ipdb to inspect incoming requests, or directly manipulate the response headers or content.

Alternatively, if you’re looking for something slightly more full-featured (but still very lightweight) try Flask.