Web服務器網關接口
外觀
Web服務器閘道接口(Python Web Server Gateway Interface,縮寫為WSGI)是為Python語言定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口。自從WSGI被開發出來以後,許多其它語言中也出現了類似接口。
發展背景
[編輯]以前,如何選擇合適的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 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(響應消息的頭)。
- 第三行將響應消息的消息體返回。
調用一個應用程序的示例
[編輯]此章節需要擴充。 (2011年3月1日) |
調用一個程序並獲取它的應答消息的例子如下所示:
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應用框架有很多:
影響
[編輯]- 2003年: 原初的Python版本 [11]
- 2007年: Rack,Ruby版本 [12]
- 2008年: Lua WSAPI,Lua版本 [13]
- 2009年: JSGI,JavaScript版本 [14]
- 2009年: PSGI,Perl版本 [15]
- 2010年: Hack,Haskell版本 [16]
注釋
[編輯]- ^ 在規範中,使用術語「callable」表示一個函數,方法,類或帶有__call__ method實例。
參考文獻
[編輯]- ^ PEP 3333 (頁面存檔備份,存於網際網路檔案館), Python Web Server Gateway Interface v1.0
- ^ Bobo light-weight framework for creating WSGI web applications. [2021-02-09]. (原始內容存檔於2011-12-01).
- ^ Bottle Micro-Framework. [2021-02-09]. (原始內容存檔於2014-06-04).
- ^ Django with WSGI support. [2011-03-18]. (原始內容存檔於2021-04-01).
- ^ prestans Micro-Framework. [2013-09-23]. (原始內容存檔於2012-10-08).
- ^ restlite server tools for quick prototyping. [2013-09-23]. (原始內容存檔於2016-06-01).
- ^ Ulibweb github source code. [2013-09-23]. (原始內容存檔於2021-12-10).
- ^ web.py official site. [2012-08-28]. (原始內容存檔於2011-10-26).
- ^ weblayer package for writing WSGI application. [2011-03-18]. (原始內容存檔於2013-01-26).
- ^ Werkzeug, the Python WSGI Utility Library. [2013-09-23]. (原始內容存檔於2021-04-01).
- ^ [1] (頁面存檔備份,存於網際網路檔案館) WSGI
- ^ 存档副本. [2011-03-18]. (原始內容存檔於2007-03-15). Rack接口
- ^ [2] (頁面存檔備份,存於網際網路檔案館) WSAPI接口
- ^ [3] (頁面存檔備份,存於網際網路檔案館) JSGI接口
- ^ [4] (頁面存檔備份,存於網際網路檔案館) PSGI接口
- ^ [5] (頁面存檔備份,存於網際網路檔案館) Hack接口