此文檔用于解讀理解
WSGI
和ASGI
兩個概念窑眯,目標(biāo)解決一下幾個問題:
- 什么是
WSGI
- 什么是
ASGI
-
WSGI
和ASGI
的區(qū)別在哪
什么是 WSGI
先說一下CGI
,(通用網(wǎng)關(guān)接口痹雅, Common Gateway Interface/CGI),定義客戶端與Web服務(wù)器的交流方式的一個程序糊识。例如正常情況下客戶端發(fā)來一個請求绩社,根據(jù)HTTP
協(xié)議Web服務(wù)器將請求內(nèi)容解析出來,進(jìn)過計算后赂苗,再將加us安出來的內(nèi)容封裝好愉耙,例如服務(wù)器返回一個HTML
頁面,并且根據(jù)HTTP
協(xié)議構(gòu)建返回內(nèi)容的響應(yīng)格式拌滋。涉及到TCP
連接朴沿、HTTP
原始請求和相應(yīng)格式的這些,都由一個軟件來完成败砂,這時赌渣,以上的工作需要一個程序來完成,而這個程序便是CGI
昌犹。
那什么是WSGI
呢坚芜?維基上的解釋為,Web服務(wù)器網(wǎng)關(guān)接口(Python Web Server Gateway Interface斜姥,WSGI)鸿竖,是為Python
語言定義的Web服務(wù)器和Web應(yīng)用程序或框架之間的一種簡單而通用的接口。從語義上理解铸敏,貌似WSGI
就是Python
為了解決Web服務(wù)器端與客戶端之間的通信問題而產(chǎn)生的缚忧,并且WSGI
是基于現(xiàn)存的CGI
標(biāo)準(zhǔn)而設(shè)計的,同樣是一種程序(或者Web
組件的接口規(guī)范搞坝?)搔谴。
WSGI區(qū)分為兩部分:一種為“服務(wù)器”或“網(wǎng)關(guān)”,另一種為“應(yīng)用程序”或“應(yīng)用框架”桩撮。
所謂的WSGI
中間件同時實現(xiàn)了API
的兩方敦第,即在WSGI
服務(wù)器和WSGI
應(yīng)用之間起調(diào)解作用:從WSGI
服務(wù)器的角度來說峰弹,中間件扮演應(yīng)用程序,而從應(yīng)用程序的角度來說芜果,中間件扮演服務(wù)器鞠呈。中間件具有的功能:
- 重寫環(huán)境變量后,根據(jù)目標(biāo)URL右钾,將請求消息路由到不同的應(yīng)用對象蚁吝。
- 允許在一個進(jìn)程中同時運行多個應(yīng)用程序或應(yīng)用框架
- 負(fù)載均衡和遠(yuǎn)程處理,通過在網(wǎng)絡(luò)上轉(zhuǎn)發(fā)請求和相應(yīng)消息舀射。
- 進(jìn)行內(nèi)容后處理窘茁,例如應(yīng)用
XSLT
樣式表。(以上 from 維基)
看了這么多脆烟,總結(jié)一下山林,其實可以說WSGI
就是基于Python
的以CGI
為標(biāo)準(zhǔn)做一些擴(kuò)展。
什么是ASGI
異步網(wǎng)關(guān)協(xié)議接口邢羔,一個介于網(wǎng)絡(luò)協(xié)議服務(wù)和Python
應(yīng)用之間的標(biāo)準(zhǔn)接口驼抹,能夠處理多種通用的協(xié)議類型,包括HTTP
拜鹤,HTTP2
和WebSocket
框冀。
然而目前的常用的WSGI
主要是針對HTTP
風(fēng)格的請求響應(yīng)模型做的設(shè)計,并且越來越多的不遵循這種模式的協(xié)議逐漸成為Web
變成的標(biāo)準(zhǔn)之一敏簿,例如WebSocket
明也。
ASGI
嘗試保持在一個簡單的應(yīng)用接口的前提下,提供允許數(shù)據(jù)能夠在任意的時候惯裕、被任意應(yīng)用進(jìn)程發(fā)送和接受的抽象诡右。并且同樣描述了一個新的,兼容HTTP
請求響應(yīng)以及WebSocket
數(shù)據(jù)幀的序列格式轻猖。允許這些協(xié)議能通過網(wǎng)絡(luò)或本地socket
進(jìn)行傳輸,以及讓不同的協(xié)議被分配到不同的進(jìn)程中域那。
WSGI和ASGI的區(qū)別在哪
以上咙边,WSGI
是基于HTTP
協(xié)議模式的,不支持WebSocket
次员,而ASGI
的誕生則是為了解決Python
常用的WSGI
不支持當(dāng)前Web
開發(fā)中的一些新的協(xié)議標(biāo)準(zhǔn)败许。同時,ASGI
對于WSGI
原有的模式的支持和WebSocket
的擴(kuò)展淑蔚,即ASGI
是WSGI
的擴(kuò)展市殷。