WSGI到底是什麼?

2021-10-22 22:56:45 字數 2656 閱讀 9095

在python web開發時經常會遇到wsgi,所以wsgi到底是什麼呢?本文我們一起來揭開wsgi神秘的面紗!

先來看一下wsgi的介紹

全稱python web server gateway inte***ce,指定了web伺服器和python web應用或web框架之間的標準介面,以提高web應用在一系列web伺服器間的移植性。 具體可檢視 官方文件

從以上介紹我們可以看出:

wsgi是一套介面標準協議/規範;

通訊(作用)區間是web伺服器和python web應用程式之間;

目的是制定標準,以保證不同web伺服器可以和不同的python程式之間相互通訊

你可能會問,為什麼需要wsgi?

首先,我們明確一下web應用處理請求的具體流程:

使用者操作操作瀏覽器傳送請求;

請求**至對應的web伺服器

web伺服器將請求轉交給web應用程式,web應用程式處理請求

web應用將請求結果返回給web伺服器,由web伺服器返回使用者響應結果

瀏覽器收到響應,向使用者展示

可以看到,請求時web伺服器需要和web應用程式進行通訊,但是web伺服器有很多種啊,python web應用開發框架也對應多種啊,所以wsgi應運而生,定義了一套通訊標準。試想一下,如果不統一標準的話,就會存在web框架和web伺服器資料無法匹配的情況,那麼開發就會受到限制,這顯然不合理的。

既然定義了標準,那麼wsgi的標準或規範是?

web伺服器在將請求轉交給web應用程式之前,需要先將http報文轉換為wsgi規定的格式。

wsgi規定,web程式必須有乙個可呼叫物件,且該可呼叫物件接收兩個引數,返回乙個可迭代物件:

environ:字典,包含請求的所有資訊

start_response:在可呼叫物件中呼叫的函式,用來發起響應,引數包括狀態碼,headers等

通過以上學習,一起實現乙個簡單wsgi服務吧

首先,我們編寫乙個符合wsgi標準的乙個http處理函式:

def hello(environ, start_response):

status = "200 ok"

response_headers = [('content-type', 'text/html')]

start_response(status, response_headers)

path = environ['path_info'][1:] or 'hello'

return [b'' % path.encode()]

該方法負責獲取environ字典中的path_info,也就是獲取請求路徑,然後在前端展示。

接下來,我們需要乙個伺服器啟動wsgi伺服器用來處理驗證,使用python內建的wsgi伺服器模組wsgiref,編寫server.py:

# coding:utf-8

"""desc: wsgi伺服器實現

main()

執行python server.py,瀏覽器開啟"http://localhost:8001/a",即可驗證。

通過實現乙個簡單的wsgi服務,我們可以看到:通過environ可以獲取http請求的所有資訊,http響應的資料都可以通過start_response加上函式的返回值作為body。

當然,以上只是乙個簡單的案例,那麼在python的web框架內部是如何遵循wsgi規範的呢?以flask舉例,

flask與wsgi

ctx = self.request_context(environ)

error = none

try:

try:

ctx.push()

response = self.full_dispatch_request()

except exception as e:

error = e

response = self.handle_exception(e)

except: # noqa: b001

error = sys.exc_info()[1]

raise

return response(environ, start_response)

finally:

if self.should_ignore_error(error):

error = none

ctx.auto_pop(error)

def __call__(self, environ, start_response):

flask的werkzeug庫是乙個非常優秀的wsgi工具庫,具體的實現我們之後再詳細學習。

敏捷到底是什麼?

文 ivar jacobson 在支援軟體工程 比如rational統一過程rup 與敏捷陣營 比如scrum或是xp 之間,人們一直存在著衝突。也不難理解,因為這兩種方法間都是在用著彼此並不相容的方式來描述的。其實大可不必,因為他們背後的觀點全然是相輔相成的。關鍵在於該如何用對兩者來說都公平的方式...

我們到底是什麼?

我們到底是什麼?我們是一種生物電流 生物電流有幾種狀態,喜怒哀樂等,可以根據外部環境進行自我切換 該種生物電流附屬在一種器官硬體上面 我們可以從器官硬體上感知一些資訊,產生新的資訊生物電流,新產生的生物電流符合原先的標準 我們可以把資訊電流儲存在器官硬體上,但具體如何儲存等資訊無法被我們感知 我們的...

SDN到底是什麼

sdn到底是什麼?雖然這個概念已經被炒到了,但還沒有人對其給出乙個明確的概念。盛科網路總監張衛峰撰寫了自己關注sdn以來,對其認識的四個階段,最後乙個階段又回到了sdn字面的意思軟體定義網路,每個階段作者的新觀點,也會給我們帶來一些啟發。以下為原文 我對sdn的認識可以分為四個階段,最後乙個階段是在...