Web Server Gateway Interface Explained

The Web Server Gateway Interface (WSGI, pronounced whiskey[1] [2] or [3]) is a simple calling convention for web servers to forward requests to web applications or frameworks written in the Python programming language. The current version of WSGI, version 1.0.1, is specified in Python Enhancement Proposal (PEP) 3333.[4]

WSGI was originally specified as PEP-333 in 2003.[5] PEP-3333, published in 2010, updates the specification for .

Background

In 2003, Python web frameworks were typically written against only CGI, FastCGI, mod_python, or some other custom API of a specific web server.[6] To quote PEP 333:

Python currently boasts a wide variety of web application frameworks, such as Zope, Quixote, Webware, SkunkWeb, PSO, and Twisted Web -- to name just a few. This wide variety of choices can be a problem for new Python users, because generally speaking, their choice of web framework will limit their choice of usable web servers, and vice versa... By contrast, although Java has just as many web application frameworks available, Java's "servlet" API makes it possible for applications written with any Java web application framework to run in any web server that supports the servlet API.

WSGI was thus created as an implementation-neutral 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:

Between the server and the application, there may be one or more WSGI middleware components, which implement both sides of the API, typically in Python code.

WSGI does not specify how the Python interpreter should be started, nor how the application object should be loaded or configured, and different frameworks and webservers achieve this in different ways.

WSGI middleware

A WSGI middleware component is a Python callable that is itself a WSGI application, but may handle requests by delegating to other WSGI applications. These applications can themselves be WSGI middleware components.[7]

A middleware component can perform such functions as:

Examples

Example application

A WSGI-compatible "Hello, World!" application written in Python:def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) yield b'Hello, World!\n'

Where:

Example of calling an application

A full example of a WSGI network server is outside the scope of this article. Below is a sketch of how one would call a WSGI application and retrieve its HTTP status line, response headers, and response body, as Python objects.[10] Details of how to construct the environ dict have been omitted.from io import BytesIO

def call_application(app, environ): status = None headers = None body = BytesIO def start_response(rstatus, rheaders): nonlocal status, headers status, headers = rstatus, rheaders app_iter = app(environ, start_response) try: for data in app_iter: assert status is not None and headers is not None, \ "start_response was not called" body.write(data) finally: if hasattr(app_iter, 'close'): app_iter.close return status, headers, body.getvalue

environ = # "environ" dictstatus, headers, body = call_application(app, environ)

WSGI-compatible applications and frameworks

Numerous web frameworks support WSGI:

Currently wrappers are available for FastCGI, CGI, SCGI, AJP (using flup), twisted.web, Apache (using mod_wsgi or mod_python), Nginx (using ngx_http_uwsgi_module),[26] Nginx Unit (using the Python language module),[27] and Microsoft IIS (using WFastCGI,[28] isapi-wsgi,[29] PyISAPIe,[30] or an ASP gateway).

See also

External links

Notes and References

  1. Web site: Simionato . Michele . An Introduction to Web Programming with WSGI . June 11, 2007 .
  2. Edge . Jake . Mucking about with microframeworks . LWN . July 9, 2019 .
  3. Web site: Goldberg. Kevin. 2016-05-09. An Introduction to Python WSGI Servers for Performance AppDynamics. 2020-08-20. Application Performance Monitoring Blog AppDynamics. en-US.
  4. Web site: PEP 3333 - Python Web Server Gateway Interface v1.0.1. Python.org. 2018-04-04.
  5. Web site: PEP 333 -- Python Web Server Gateway Interface v1.0. Python.org. en. 2018-04-04.
  6. Web site: FrontPage - Python Wiki. Python.org. 2017-01-27.
  7. Web site: PEP 3333 -- Python Web Server Gateway Interface v1.0.1. Python.org. en. 2018-04-04.
  8. i.e. "a function, method, class, or an instance with a __call__ method"
  9. Web site: PEP 3333 -- Python Web Server Gateway Interface v1.0.1. Python.org. en. 2018-04-04.
  10. Web site: Creating WSGI Middleware - Alan Christopher Thomas - Minted - PythonKC. https://ghostarchive.org/varchive/youtube/20211212/afnDANxsaYo. 2021-12-12 . live. 2015-08-28. YouTube. 2017-01-27.
  11. Web site: プエラリアジェルの効果は? . Bobo.digicool.com . 2017-01-27.
  12. Web site: Django without mod_python, and WSGI support | Weblog | Django . Djangoproject.com . 2005-07-18 . 2017-01-27.
  13. Web site: wsgi – WSGI server — Eventlet 0.20.1 documentation . Eventlet.net . 2017-01-27.
  14. Web site: Falcon - Bare-metal web API framework for Python . 2017-10-22.
  15. Web site: gevent-fastcgi 1.0.2.1 : Python Package Index . Pypi.python.org . 2015-12-06 . 2017-01-27.
  16. Web site: anomaly/prestans: A WSGI compliant REST micro-framework . GitHub.com . 2017-01-27.
  17. Web site: Google Code Archive - Long-term storage for Google Code Project Hosting . Code.google.com . 2017-01-27.
  18. Web site: Pycnic Framework . Pycnic.nullism.com . 2017-01-27.
  19. Web site: theintencity/restlite: Light-weight RESTful server tools in Python . GitHub.com . 2017-01-27.
  20. Web site: limodou/uliweb: Simple and easy use python web framework . GitHub.com . 2017-01-27.
  21. Web site: waitress documentation . docs.pylonsproject.org . 2018-09-26.
  22. Web site: Welcome to . Web.py . 2009-09-11 . 2017-01-27.
  23. Web site: weblayer — weblayer v0.4.3 documentation . Packages.python.org . 2017-01-27.
  24. Web site: Welcome | Werkzeug (The Python WSGI Utility Library) . Werkzeug.pocoo.org . 2017-01-27.
  25. Web site: CalDAV and CardDAV Server - A Simple Calendar and Contact Server . Radicale.org . 2017-01-27.
  26. Web site: Module ngx_http_uwsgi_module . Nginx.org . 2017-01-27.
  27. Web site: Configuration — NGINX Unit . Unit.nginx.org . 2023-05-04.
  28. Web site: Python Tools for Visual Studio - Documentation . Pytools.codeplex.com . 2017-01-27.
  29. Web site: Google Code Archive - Long-term storage for Google Code Project Hosting . Code.google.com . 2017-01-27.
  30. Web site: Python ISAPI Extension for IIS download | SourceForge.net . Pyisapie.sourceforge.net . 2012-04-24 . 2017-01-27.