-
wsgi
鎖定
- 中文名
- Web服務器網關接口
- 領 域
- 計算機網絡
- 特 點
- 多線程
wsgi簡介
Web服務器網關接口(Web Server Gateway Interface,縮寫為WSGI)是Python應用程序或框架和Web服務器之間的一種接口,已經被廣泛接受, 它已基本達成它的可移植性方面的目標。
WSGI 沒有官方的實現, 因為WSGI更像一個協議. 只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行, 反之亦然。
wsgi發展背景
以前,如何選擇合適的Web應用程序框架成為困擾Python初學者的一個問題,這是因為,一般而言,Web應用框架的選擇將限制可用的Web服務器的選擇,反之亦然。那時的Python應用程序通常是為CGI,FastCGI,mod_python中的一個而設計,甚至是為特定Web服務器的自定義的API接口而設計的。
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的
wsgi規範概覽
WSGI區分為兩個部分:一為“服務器”或“網關”,另一為“應用程序”或“應用框架”。在處理一個WSGI請求時,服務器會為應用程序提供環境信息及一個回調函數(Callback Function)。當應用程序完成處理請求後,透過前述的回調函數,將結果回傳給服務器。
所謂的WSGI中間件同時實現了API的兩方,因此可以在WSGI服務器和WSGI應用之間起調解作用:從Web服務器的角度來説,中間件扮演應用程序,而從應用程序的角度來説,中間件扮演服務器。“中間件”組件可以執行以下功能:
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應用框架有很多:
- bobo
- Bottle
- CherryPy
- Google App Engine's webapp2
- Gunicorn
- prestans
- restlite
- TurboGears
- weblayer
- Werkzeug
wsgi影響
- 2003年: 原初的Python版本
- 2008年: LuaWSAPI,Lua版本
- 2009年:JSGI,JavaScript版本
- 2009年:PSGI,Perl版本
- 參考資料
-
- 1. pep-0333 .python[引用日期2017-02-12]
- 2. 宋凱, 嚴麗平, 甘嵐. 嵌入式Web服務器的設計與實現[J]. 計算機工程與設計, 2009, 30(4):808-810.
- 3. Python的Web服務網關接口 WSGI .開源社區網[引用日期2012-09-15]