WSGI

WSGI

Web服務器網關接口(Python Web Server Gateway Interface,縮寫爲WSGI)是爲Python語言定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口。自從WSGI被開發出來以後,許多其它語言中也出現了類似接口。WSGI是作爲Web服務器與Web應用程序或應用框架之間的一種低級別的接口,以提升可移植Web應用開發的共同點。WSGI是基於現存的CGI標準而設計的。
WSGI區分爲兩個部份:一爲“服務器”或“網關”,另一爲“應用程序”或“應用框架”。在處理一個WSGI請求時,服務器會爲應用程序提供環境資訊及一個回呼函數(Callback Function)。當應用程序完成處理請求後,透過前述的回呼函數,將結果回傳給服務器。所謂的 WSGI 中間件同時實現了API的兩方,因此可以在WSGI服務和WSGI應用之間起調解作用:從WSGI服務器的角度來說,中間件扮演應用程序,而從應用程序的角度來說,中間件扮演服務器。“中間件”組件可以執行以下功能:
1,重寫環境變量後,根據目標URL,將請求消息路由到不同的應用對象。
2,允許在一個進程中同時運行多個應用程序或應用框架。
3,負載均衡和遠程處理,通過在網絡上轉發請求和響應消息。
4,進行內容後處理,例如應用XSLT樣式表。
以前,如何選擇合適的Web應用程序框架成爲困擾Python初學者的一個問題,這是因爲,一般而言,Web應用框架的選擇將限制可用的Web服務器的選擇,反之亦然。那時的Python應用程序通常是爲CGI,FastCGI,mod_python中的一個而設計,甚至是爲特定Web服務器的自定義的API接口而設計的。WSGI沒有官方的實現, 因爲WSGI更像一個協議。只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行, 反之亦然。WSGI就是Python的CGI包裝,相對於Fastcgi是PHP的CGI包裝。
WSGI將 web 組件分爲三類: web服務器,web中間件,web應用程序, wsgi基本處理模式爲 : WSGI Server -> (WSGI Middleware)* -> WSGI Application 。
wsgi

1、WSGI Server/gateway

wsgi server可以理解爲一個符合wsgi規範的web server,接收request請求,封裝一系列環境變量,按照wsgi規範調用註冊的wsgi app,最後將response返回給客戶端。文字很難解釋清楚wsgi server到底是什麼東西,以及做些什麼事情,最直觀的方式還是看wsgi server的實現代碼。以python自帶的wsgiref爲例,wsgiref是按照wsgi規範實現的一個簡單wsgi server。它的代碼也不復雜。
wsgi server
1,服務器創建socket,監聽端口,等待客戶端連接。
2,當有請求來時,服務器解析客戶端信息放到環境變量environ中,並調用綁定的handler來處理請求。
3,handler解析這個http請求,將請求信息例如method,path等放到environ中。
4,wsgi handler再將一些服務器端信息也放到environ中,最後服務器信息,客戶端信息,本次請求信息全部都保存到了環境變量environ中。
5,wsgi handler 調用註冊的wsgi app,並將environ和回調函數傳給wsgi app
6,wsgi app 將reponse header/status/body 回傳給wsgi handler
7,最終handler還是通過socket將response信息塞回給客戶端。

2、WSGI Application

wsgi application就是一個普通的callable對象,當有請求到來時,wsgi server會調用這個wsgi app。這個對象接收兩個參數,通常爲environ,start_response。environ就像前面介紹的,可以理解爲環境變量,跟一次請求相關的所有信息都保存在了這個環境變量中,包括服務器信息,客戶端信息,請求信息。start_response是一個callback函數,wsgi application通過調用start_response,將response headers/status 返回給wsgi server。此外這個wsgi app會return 一個iterator對象 ,這個iterator就是response body。這麼空講感覺很虛,對着下面這個簡單的例子看就明白很多了。

3、WSGI MiddleWare

有些功能可能介於服務器程序和應用程序之間,例如,服務器拿到了客戶端請求的URL, 不同的URL需要交由不同的函數處理,這個功能叫做 URL Routing,這個功能就可以放在二者中間實現,這個中間層就是 middleware。middleware對服務器程序和應用是透明的,也就是說,服務器程序以爲它就是應用程序,而應用程序以爲它就是服務器。這就告訴我們,middleware需要把自己僞裝成一個服務器,接受應用程序,調用它,同時middleware還需要把自己僞裝成一個應用程序,傳給服務器程序。
其實無論是服務器程序,middleware 還是應用程序,都在服務端,爲客戶端提供服務,之所以把他們抽象成不同層,就是爲了控制複雜度,使得每一次都不太複雜,各司其職。

http://www.biaodianfu.com/cgi-fastcgi-wsgi.html

發佈了46 篇原創文章 · 獲贊 10 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章