Web伺服器閘道器介面

Web伺服器閘道介面Python Web Server Gateway Interface,縮寫為WSGI)是為Python語言定義的Web伺服器Web應用程式框架之間的一種簡單而通用的介面。自從WSGI被開發出來以後,許多其它語言中也出現了類似介面。

發展背景

編輯

以前,如何選擇合適的Web應用程式框架成為困擾Python初學者的一個問題,這是因為,一般而言,Web應用框架的選擇將限制可用的Web伺服器的選擇,反之亦然。那時的Python應用程式通常是為CGIFastCGImod_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 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(響應訊息的頭)。
  • 第三行將響應訊息的訊息體返回。

呼叫一個應用程式的範例

編輯

呼叫一個程式並取得它的應答訊息的例子如下所示:

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應用框架有很多:

影響

編輯

註釋

編輯
  1. ^ 在規範中,使用術語「callable」表示一個函數,方法,類或帶有__call__ method實例。

參考文獻

編輯
  1. ^ PEP 3333頁面存檔備份,存於互聯網檔案館), Python Web Server Gateway Interface v1.0
  2. ^ Bobo light-weight framework for creating WSGI web applications. [2021-02-09]. (原始內容存檔於2011-12-01). 
  3. ^ Bottle Micro-Framework. [2021-02-09]. (原始內容存檔於2014-06-04). 
  4. ^ Django with WSGI support. [2011-03-18]. (原始內容存檔於2021-04-01). 
  5. ^ prestans Micro-Framework. [2013-09-23]. (原始內容存檔於2012-10-08). 
  6. ^ restlite server tools for quick prototyping. [2013-09-23]. (原始內容存檔於2016-06-01). 
  7. ^ Ulibweb github source code. [2013-09-23]. (原始內容存檔於2021-12-10). 
  8. ^ web.py official site. [2012-08-28]. (原始內容存檔於2011-10-26). 
  9. ^ weblayer package for writing WSGI application. [2011-03-18]. (原始內容存檔於2013-01-26). 
  10. ^ Werkzeug, the Python WSGI Utility Library. [2013-09-23]. (原始內容存檔於2021-04-01). 
  11. ^ [1]頁面存檔備份,存於互聯網檔案館) WSGI
  12. ^ 存档副本. [2011-03-18]. (原始內容存檔於2007-03-15).  Rack介面
  13. ^ [2]頁面存檔備份,存於互聯網檔案館) WSAPI介面
  14. ^ [3]頁面存檔備份,存於互聯網檔案館) JSGI介面
  15. ^ [4]頁面存檔備份,存於互聯網檔案館) PSGI介面
  16. ^ [5]頁面存檔備份,存於互聯網檔案館) Hack介面

外部連結

編輯