Web服务器网关接口

Web服务器-{zh-cn:网关;zh-tw:閘道}-接口（Python Web Server Gateway Interface，缩写为WSGI）是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后，许多其它语言中也出现了类似接口。

发展背景
以前，如何选择合适的Web应用程序框架成为困扰Python初学者的一个问题，这是因为，一般而言，Web应用框架的选择将限制可用的Web服务器的选择，反之亦然。那时的Python应用程序通常是为CGI，FastCGI，中的一个而设计，甚至是为特定Web服务器的自定义的API接口而设计的。

WSGIPEP 3333 , Python Web Server Gateway Interface v1.0 （有时发音作'wiz-gee'）是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口，以提升可移植Web应用开发的共同点。WSGI是基于现存的CGI标准而设计的。

规范概览
WSGI區分為兩個部份：一為「伺服器」或「-{zh-cn:网关;zh-tw:閘道}-」，另一為「應用程序」或「應用框架」。在處理一個WSGI請求時，伺服器會為應用程序提供環境資訊及一個回呼函數（Callback Function）。當應用程序完成處理請求後，透過前述的回呼函數，將結果回傳給伺服器。

所谓的“WSGI 中介軟體”同时实现了API的两方，因此可以在WSGI服务器和WSGI应用之间起调解作用：从Web服务器的角度来说，中介軟體扮演应用程序，而从应用程序的角度来说，中介軟體扮演服务器。“中介軟體”组件可以执行以下功能：
 重写环境变量后，根据目标URL，将请求消息路由到不同的应用对象。
允许在一个进程中同时运行多个应用程序或应用框架。
 负载均衡和远程处理，通过在网络上转发请求和响应消息。
 进行内容后处理，例如应用XSLT样式表。

示例程序
用Python语言写的一个符合WSGI的“Hello World”应用程序如下所示：
def app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield b"Hello world!\n"
其中
 第一行定义了一个名为 app 的 callable，接受两个参数，environ 和 start_response，environ 是一个包含了 CGI 中的环境变量的字典。
 第二行调用了start_response，状态指定为“200 OK”，消息头指定为内容类型是“text/plain”。start_response 也是一个 callable，接受两个必须的参数，status（HTTP 状态）和 response_headers（响应消息的头）。
 第三行将响应消息的消息体返回。

调用一个应用程序的示例

调用一个程序并获取它的应答消息的例子如下所示：
def call_application(app, environ):
    body = []
    status_headers = [None, None]
    def start_response(status, headers):
        status_headers[:] = [status, headers]
        return body.append
    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兼容的应用和框架
支持WSGI的Web应用框架有很多：

 BlueBream
 bobo
 Bottle
 CherryPy
 Django
 Flask
 Google App Engine's webapp2
 Gunicorn
 prestans
 Pylons
 Pyramid
 restlite
 Tornado
 Trac
 TurboGears
 Uliweb
 web.py
 web2py
 weblayer
 Werkzeug

影响
 2003年： 原初的Python版本   WSGI
 2007年： Rack，Ruby版本  Rack接口
 2008年： Lua WSAPI，Lua版本   WSAPI接口
 2009年： JSGI，JavaScript版本   JSGI接口
 2009年： PSGI，Perl版本   PSGI接口
 2010年： Hack，Haskell版本   Hack接口

 注释 

 参考文献 

 外部連結 
PEP 333 -- Python Web Server Gateway Interface v1.0 
PEP 3333 -- Python Web Server Gateway Interface v1.0.1 
 WSGI metaframework
 关于WSGI的Wiki网站 
 WSGI教程 
 Hoxide · 2006-03-03 · WSGI简介
 啄木鸟关于wsgi的介绍 

Category:应用程序接口
Category:Python