複製鏈接
請複製以下鏈接發送給好友

wsgi

鎖定
Web服務器網關接口Web Server Gateway Interface,縮寫為WSGI)是為Python語言定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口。自從WSGI被開發出來以後,許多其它語言中也出現了類似接口。
中文名
Web服務器網關接口
領    域
計算機網絡
特    點
多線程
語    種
Python
全    稱
Web Server Gateway Interface
釋    義
Web服務器Web應用程序框架之間的一種簡單而通用的接口

wsgi簡介

Web服務器網關接口(Web Server Gateway Interface,縮寫為WSGI)是Python應用程序或框架和Web服務器之間的一種接口,已經被廣泛接受, 它已基本達成它的可移植性方面的目標。
WSGI 沒有官方的實現, 因為WSGI更像一個協議. 只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行, 反之亦然。
WSGI標準在 PEP 333 [1]  中定義並被許多框架實現,其中包括現廣泛使用的Django框架。

wsgi發展背景

以前,如何選擇合適的Web應用程序框架成為困擾Python初學者的一個問題,這是因為,一般而言,Web應用框架的選擇將限制可用的Web服務器的選擇,反之亦然。那時的Python應用程序通常是為CGIFastCGI,mod_python中的一個而設計,甚至是為特定Web服務器的自定義的API接口而設計的。
WSGI(有時發音作'wiz-gee')是作為Web服務器與Web應用程序或應用框架之間的一種低級別的接口,以提升可移植Web應用開發的共同點。WSGI是基於現存的CGI標準而設計的 [2] 

wsgi特點

Python Paste - WSGI底層工具集. 包括多線程, SSL和 基於Cookies, sessions等的驗證(authentication)庫. 可以用Paste方便地搭建自己的Web框架。
WSGI:Python Web Server Gateway Interface v1.0
它是 PEP3333中定義的(PEP3333的目標建立一個簡單的普遍適用的服務器與Web框架之間的接口)
WSGI是Python應用程序或框架和Web服務器之間的一種接口
WSGI被廣泛接受, 已基本達成它了可移植性方面的目標
在Guido的 Blog 中反覆提及, 個人認為WSGI是Python Web方面最Pythonic的
類似於Java中的"servlet" API。 [3] 

wsgi規範概覽

WSGI區分為兩個部分:一為“服務器”或“網關”,另一為“應用程序”或“應用框架”。在處理一個WSGI請求時,服務器會為應用程序提供環境信息及一個回調函數(Callback Function)。當應用程序完成處理請求後,透過前述的回調函數,將結果回傳給服務器。
所謂的WSGI中間件同時實現了API的兩方,因此可以在WSGI服務器和WSGI應用之間起調解作用:從Web服務器的角度來説,中間件扮演應用程序,而從應用程序的角度來説,中間件扮演服務器。“中間件”組件可以執行以下功能:
  • 重寫環境變量後,根據目標URL,將請求消息路由到不同的應用對象。
  • 允許在一個進程中同時運行多個應用程序或應用框架。
  • 負載均衡和遠程處理,通過在網絡上轉發請求和響應消息。
  • 進行內容後處理,例如應用XSLT樣式表。

wsgi示例程序

Python語言寫的一個符合WSGI的“Hello World”應用程序如下所示:
def app(environ, start_response):
  start_response('200 OK', [('Content-Type', 'text/plain')])
  yield "Hello world!\n"
其中
  • 第一行定義了一個名為 app 的 callable,接受兩個參數,environ 和 start_response,environ 是一個字典包含了 CGI 中的環境變量。
  • 第二行調用了start_response,狀態指定為“200 OK”,消息頭指定為內容類型是“text/plain”。start_response 也是一個 callable,接受兩個必須的參數,status(HTTP 狀態)和 response_headers(響應消息的頭)。
  • 第三行將響應消息的消息體返回。

wsgi調用應用程序示例

調用一個程序並獲取它的應答消息的例子如下所示:
def call_application(app, environ):
  body = []
  status_headers = [None, None]

  def start_response(status, headers):
    status_headers[:] = [status, headers]
    return body.append(status_headers)

  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...})

wsgiWSGI兼容的應用和框架

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

wsgi影響

  • 2003年: 原初的Python版本
  • 2007年:RackRuby版本
  • 2008年: LuaWSAPI,Lua版本
  • 2009年:JSGI,JavaScript版本
  • 2009年:PSGI,Perl版本
  • 2010年:HackHaskell版本
參考資料