Web Server Gateway Interface

"WSGI" redirects here. For the radio station in Springfield, see WSGI (AM).

The Web Server Gateway Interface (WSGI) is a specification for simple and universal interface between web servers and web applications or frameworks for the Python programming language. It was originally specified in PEP 333[1] authored by Phillip J. Eby, and published on 7 December 2003. It has since been adopted as a standard for Python web application development. The latest version of the specification is v1.0.1, also known as PEP 3333, published on 26 September 2010.[2]

Idea

Python web application frameworks had been a problem for new Python users because the choice of web framework would limit the choice of usable web servers, and vice versa.[3] Python applications were often designed for only one of CGI, FastCGI, mod_python or some other custom API of a specific web server.

WSGI[2] was created as a low-level interface between web servers and web applications or frameworks to promote common ground for portable web application development.

Specification overview

The WSGI has two sides: the "server" or "gateway" side (often a web server like Apache or Nginx), and the "application" or "framework" side (the python script itself). To process a WSGI request, the server side executes the application and provides environment information and a callback function to the application side. The application processes the request, and returns the response to the server side using the callback function it was provided.

Between the server and the application, there may be a WSGI middleware, which implements both sides of the API. The server receives a request from a client and forwards it to the middleware. After processing it sends a request to another WSGI application whose response is forwarded to the client via the middleware and ultimately via the server. There may be multiple middlewares, thus forming a stack of WSGI-compliant applications.

A "middleware" component can perform such functions as:

Example application

A WSGI-compatible “Hello World” application written in Python:

1 def application(environ, start_response):
2     start_response('200 OK', [('Content-Type', 'text/plain')])
3     yield 'Hello World\n'

Where:

Example of calling an application

An example of calling an application and retrieving its response:

def call_application(app, environ):
    body = []
    status_headers = [None, None]
    def start_response(status, headers):
        status_headers[:] = [status, headers]
        return body.append(status_headers)
    app_iter = app(environ, start_response)
    try:
        for item in app_iter:
            body.append(item)
    finally:
        if hasattr(app_iter, 'close'):
            app_iter.close()
    return status_headers[0], status_headers[1], ''.join(body)

status, headers, body = call_application(app, {...environ...})

WSGI-compatible applications and frameworks

There are numerous web application frameworks supporting WSGI:

Wrappers

The server or gateway invokes the application callable once for each request it receives from an HTTP client, that is directed at the application.

Currently wrappers are available for FastCGI, CGI, SCGI, AJP (using flup), twisted.web, Apache (using mod_wsgi or mod_python), Nginx (using mod_wsgi), and Microsoft IIS (using WFastCGI, isapi-wsgi, PyISAPIe, or an ASP gateway).

WSGI and Python 3

The separation of binary and text data in Python 3 poses a problem for WSGI, as it specifies that header data should be strings, while it sometimes needs to be binary and sometimes text. This works in Python 2 where text and binary data both are kept in "string" variables, but in Python 3 binary data is kept in "bytes" variables and "string" variables are for unicode text data. An updated version of the WSGI specification that deals with this is PEP 3333.[18]

A reworked WSGI spec Web3 has also been proposed, specified in PEP444. This standard is an incompatible derivative of WSGI designed to work on Python 2.6, 2.7, 3.1+.[19]

See also

References

External links

This article is issued from Wikipedia - version of the Monday, January 25, 2016. The text is available under the Creative Commons Attribution/Share Alike but additional terms may apply for the media files.