Web Server Gateway Interface
|
|
This article's lead section may not adequately summarize key points of its contents. (April 2012) |
The Web Server Gateway Interface defines a simple and universal interface between web servers and web applications or frameworks for the Python programming language.
Contents |
Idea [edit]
Python web application frameworks have been a problem for new Python users because the choice of web framework would limit the choice of usable web servers, and vice versa.[citation needed] Python applications were often designed for only one of CGI, FastCGI, mod_python or some other custom API interface of a specific web-server.
WSGI[1] 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 [edit]
The WSGI has two sides: the "server" or "gateway" side, and the "application" or "framework" side. To process a WSGI request, the server side provides environment information and a callback function to the application side. The application processes the request, and returns HTTP headers and request body content to the server side using the callback function it was provided.
So-called WSGI middleware implements both sides of the API so that it can intermediate between a WSGI server and a WSGI application: the middleware acts as an application from some WSGI server's point of view and as a server from some WSGI application's point of view. A "middleware" component can perform such functions as:
- Routing a request to different application objects based on the target URL, after changing the environment variables accordingly.
- Allowing multiple applications or frameworks to run side-by-side in the same process
- Load balancing and remote processing, by forwarding requests and responses over a network
- Perform content postprocessing, such as applying XSLT stylesheets
Example application [edit]
A WSGI-compatible “Hello World” application written in Python:
def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) yield 'Hello World\n'
Where:
- Line 1 defines a callable[2] named
application, which takes two parameters,environandstart_response.environis a dictionary containing environment variables in CGI.start_responseis a callable taking two required parametersstatusandresponse_headers. - Line 2 calls
start_response, specifying "200 OK" as the status and a "Content-Type" header. - Line 3 returns the body of response as a string literal.
Example of calling an application [edit]
| This section requires expansion. (March 2011) |
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 [edit]
There are numerous web application frameworks supporting WSGI:
- CherryPy
- Django[3]
- web.py[8]
- web2py
- TurboGears
- Tornado
- Pylons
- BlueBream
- Google App Engine's webapp2
- Trac
- Flask
- Pyramid
- Bottle[4]
- weblayer[5]
- bobo[6]
- prestans[7]
- restlite[8]
- Werkzeug[9]
- Uliweb[9]
Wrappers [edit]
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) and Microsoft IIS (using isapi-wsgi, PyISAPIe, or an ASP gateway).
WSGI and Python 3 [edit]
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. [10]
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+.[11]
See also [edit]
- Rack: Ruby web server interface
- PSGI: Perl Web Server Gateway Interface
- SCGI
- JSGI: JavaScript web server gateway interface
References [edit]
- ^ PEP 3333, Python Web Server Gateway Interface v1.0
- ^ i.e. "a function, method, class, or an instance with a
__call__method". - ^ [1] Django with WSGI support
- ^ [2] Bottle Micro-Framework
- ^ [3] weblayer package for writing WSGI application
- ^ [4] Bobo light-weight framework for creating WSGI web applications
- ^ [5] prestans Micro-Framework
- ^ [6] restlite server tools for quick prototyping
- ^ [7] Werkzeug, the Python WSGI Utility Library
- ^ PJ Eby. "PEP 3333". Retrieved 2011-07-27.
- ^ Chris McDonough, Armin Ronacher (2010-09-16). "PEP 444 -- Python Web3 Interface". Retrieved 2010-09-20.
External links [edit]
- WSGI metaframework
- Comprehensive wiki about everything WSGI
- WSGI Tutorial
- Python standard library module wsgiref
- Getting Started with WSGI
- NWSGI, a .NET implementation of the Python WSGI specification for IronPython and IIS
|
|||||||||||||||||||||||||||