跳转到内容

Web服务器网关接口

本页使用了标题或全文手工转换
维基百科,自由的百科全书
(重定向自WSGI)

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

发展背景

[编辑]

以前,如何选择合适的Web应用程序框架成为困扰Python初学者的一个问题,这是因为,一般而言,Web应用框架的选择将限制可用的Web服务器的选择,反之亦然。那时的Python应用程序通常是为CGI,FastCGI,mod_python(英语: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 application(environ, start_response):
    start_response("200 OK", [("Content-Type", "text/plain")])
    yield b"Hello, World!\n"

其中

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

调用一个应用的示例

[编辑]

示例完整的WSGI网络服务器超出了本条目范围。下面的骨架代码展示如何调用一个WSGI应用并检索它的作为Python对象的HTTP状态行、响应头部和响应主体[2]。省略了如何构造environ字典的细节。

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" dict
status, headers, body = call_application(app, environ)

WSGI兼容的应用和框架

[编辑]

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

参见

[编辑]

注释

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

参考文献

[编辑]
  1. ^ PEP 3333 (页面存档备份,存于互联网档案馆), Python Web Server Gateway Interface v1.0
  2. ^ Creating WSGI Middleware - Alan Christopher Thomas - Minted - PythonKC. YouTube. 2015-08-28 [2017-01-27]. (原始内容存档于2021-12-12). 
  3. ^ Bobo light-weight framework for creating WSGI web applications. [2021-02-09]. (原始内容存档于2011-12-01). 
  4. ^ Bottle Micro-Framework. [2021-02-09]. (原始内容存档于2014-06-04). 
  5. ^ Django with WSGI support. [2011-03-18]. (原始内容存档于2021-04-01). 
  6. ^ prestans Micro-Framework. [2013-09-23]. (原始内容存档于2012-10-08). 
  7. ^ restlite server tools for quick prototyping. [2013-09-23]. (原始内容存档于2016-06-01). 
  8. ^ Ulibweb github source code. [2013-09-23]. (原始内容存档于2021-12-10). 
  9. ^ web.py is a web framework for Python that is as simple as it is powerful.. [2025-07-07]. (原始内容存档于2026-06-26). 
  10. ^ weblayer package for writing WSGI application. [2011-03-18]. (原始内容存档于2013-01-26). 
  11. ^ Werkzeug, the Python WSGI Utility Library. [2013-09-23]. (原始内容存档于2021-04-01). 

外部連結

[编辑]