计算机科学

首页 > 计算机科学

Web服务器网关接口

2018-08-31 10:23:01     所属分类:应用程序接口

Web服务器网关接口Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。

目录

  • 1 发展背景
  • 2 规范概览
  • 3 示例程序
  • 4 调用一个应用程序的示例
  • 5 WSGI兼容的应用和框架
  • 6 影响
  • 7 注释
  • 8 参考文献
  • 9 外部链接

发展背景

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

WSGI[1] (有时发音作'wiz-gee')是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应用开发的共同点。WSGI是基于现存的CGI标准而设计的。

规范概览

WSGI区分为两个部分:一为“服务器”或“网关”,另一为“应用程序”或“应用框架”。在处理一个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 "Hello world!n"

其中

  • 第一行定义了一个名为app的callable[注 1],接受两个参数,environ和start_response,environ是一个字典包含了CGI中的环境变量,start_response也是一个callable,接受两个必须的参数,status(HTTP状态)和response_headers(响应消息的头)。
  • 第二行调用了start_response,状态指定为“200 OK”,消息头指定为内容类型是“text/plain”。
  • 第三行将响应消息的消息体返回。

调用一个应用程序的示例

调用一个程序并获取它的应答消息的例子如下所示:

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_headers0, status_headers1, ''.join(body)

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

WSGI兼容的应用和框架

支持WSGI的Web应用框架有很多:

  • BlueBream
  • bobo[2]
  • Bottle[3]
  • CherryPy
  • Django[4]
  • Flask
  • Google App Engine's webapp2
  • Gunicorn
  • prestans[5]
  • Pylons
  • Pyramid
  • restlite[6]
  • Tornado
  • Trac
  • TurboGears
  • Uliweb[7]
  • web.py[8]
  • web2py
  • weblayer[9]
  • Werkzeug[10]

影响

  • 2003年: 原初的Python版本 [11]
  • 2007年: Rack,Ruby版本 [12]
  • 2008年: Lua WSAPI,Lua版本 [13]
  • 2009年: JSGI,JavaScript版本 [14]
  • 2009年: PSGI,Perl版本 [15]
  • 2010年: Hack,Haskell版本 [16]

注释

  1. ^ 在规范中,使用术语“callable”表示一个函数,方法,类或带有__call__ method实例。

参考文献

  1. ^ PEP 3333, Python Web Server Gateway Interface v1.0
  2. ^ Bobo light-weight framework for creating WSGI web applications. 
  3. ^ Bottle Micro-Framework. 
  4. ^ Django with WSGI support. 
  5. ^ prestans Micro-Framework. 
  6. ^ restlite server tools for quick prototyping. 
  7. ^ Ulibweb github source code. 
  8. ^ web.py official site. 
  9. ^ weblayer package for writing WSGI application. 
  10. ^ Werkzeug, the Python WSGI Utility Library. 
  11. ^ 1 WSGI
  12. ^ 存档副本. [2011-03-18]. (原始内容存档于2007-03-15).  Rack接口
  13. ^ 2 WSAPI接口
  14. ^ 3 JSGI接口
  15. ^ 4 PSGI接口
  16. ^ 5 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的介绍

上一篇:StAX
下一篇:Strict DLP Chinese
相关推荐