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接口而设计的。

WSGI (有时发音作'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版本
  • 2007年: Rack,Ruby版本
  • 2008年: Lua WSAPI,Lua版本
  • 2009年: JSGI,JavaScript版本
  • 2009年: PSGI,Perl版本
  • 2010年: Hack,Haskell版本

注释
参考文献
外部連結
*[http://www.python.org/dev/peps/pep-0333/ PEP 333 -- Python Web Server Gateway Interface v1.0]
*[http://www.python.org/dev/peps/pep-3333/ PEP 3333 -- Python Web Server Gateway Interface v1.0.1]

评论 (0)

  • 还没有评论,来抢沙发吧。