圖1:web服務器、Web框架和WSGI的三層關系。
Web服務器層
對於傳統的客戶端-服務器架構,請求處理過程是客戶端向服務器發送請求,服務器接收並處理請求,然後向客戶端返回響應。在這個過程中,服務器的作用是:
收到請求
處理請求
返回響應
Web服務器是壹種特殊的服務器,其功能主要是接收HTTP請求並返回響應。提到web服務器,大家都會很熟悉。常見的web服務器有Nginx、Apache、IIS等。在上圖1的三層結構中,web服務器是第壹個接收用戶請求並向用戶返回響應結果的。
Web框架層
web框架的主要功能是方便我們開發web應用,HTTP請求的動態數據由Web框架層提供。常見的web框架有Flask、Django等。我們以Flask framework為例來說明web framework的作用:
計算機編程語言
從燒瓶進口燒瓶
app = Flask(__name__)
@app.route('/hello ')
def hello_world():
返回“妳好,世界!”
if __name__ == '__main__ ':
app.run(主機='0.0.0.0 ',端口=8080)
1
2
三
四
五
六
七
從燒瓶進口燒瓶
app = Flask(__name__)
@app.route('/hello ')
def hello_world():
返回“妳好,世界!”
if __name__ == '__main__ ':
app.run(主機='0.0.0.0 ',端口=8080)
上面幾行簡單的代碼創建了壹個web應用程序對象app。應用程序監控8080機器的所有ip。
端口,它接受用戶的連接請求。我們知道,HTTP協議使用URL定位資源,上面的程序會把path /hello的請求交給hello_world。
方法,hello_world返回“hello world!”字符串。對於web框架的用戶來說,他們不關心如何接收HTTP。
請求,而不關心如何將請求路由到特定的方法並將響應結果返回給用戶。在大多數情況下,Web框架的用戶只需要關心如何實現業務邏輯。
WSGI層
WSGI不是服務器,也不是與程序交互的API,更不是真正的代碼。WSGI只是壹個接口,只適用於Python語言。
Web服務器網關接口,它定義了web服務器和web應用程序之間的接口規範。也就是說,只要web服務器和
Web應用遵守WSGI協議,所以web服務器和web應用可以任意組合。
下面的代碼顯示了web服務器如何與web應用程序相結合。
計算機編程語言
定義應用程序(env,start_response):
start_response('200 OK ',[('Content-Type ',' text/html')])
return [b"Hello World"]
1
2
三
定義應用程序(env,start_response):
start_response('200 OK ',[('Content-Type ',' text/html')])
return [b"Hello World"]
方法應用程序由web服務器調用,參數env和start_response由web服務器實現並傳入。其中,
Env是壹個字典,它包含諸如HTTPHOST、HOSTUSERAGENT和SERVERPROTOCO等環境變量。
Start_response是壹個接受兩個參數的方法,即status和response_headers。
application方法的主要功能是設置http響應的狀態碼、Content-Type等頭信息,返回響應的具體結果。
上面的代碼是壹個完整的WSGI應用程序。當支持WSGI的web服務器收到來自客戶機的請求時,它將調用這個應用程序。
方法。WSGI層不需要關心env和start_response是如何實現的,就像在application中壹樣。
妳在裏面做什麽,直接用這兩個變量就行了。
值得指出的是,WSGI是壹個協議,需要區分幾個相似的名詞:
Uwsgi:也是類似wsgi的協議,uWSGI服務器使用uwsgi協議。
UWSGI:實現uWSGI和WSGI協議的web服務器。註意,uWSGI本質上也是壹種web服務器,它在上述三層結構的web服務器層。
CGI:通用網關接口,不限於Python語言,定義了web服務器如何向客戶端提供動態內容。例如,它指定客戶端如何將參數傳遞給web服務器,web服務器如何將參數傳遞給web應用程序,web應用程序如何將其輸出發送給客戶端,等等。
生產環境中的Web應用不使用CGI,CGI進程(類似於Python解釋器)是為每個請求創建的,用完就丟棄,效率很低。WSGI的出現只是為了取代CGI。
說到這裏,我們已經基本明確了WSGI在web服務器和web框架之間的作用:WSGI就像壹個紐帶,連接著web服務器和Web框架。
Web框架。回到本文的主題,Nginx屬於web服務器,Flask屬於web框架。因此,WSGI和
Nginx和Flask的作用不言而喻。
Nginx、WSGI和Flask之間的對話
Nginx:嘿,WSGI,我剛剛收到壹個請求。我需要妳做壹些準備,然後Flask會處理這個請求。
WSGI:好的,Nginx .我將設置環境變量,然後將這個請求傳遞給Flask進行處理。
謝謝WSGI!給我壹些時間,我會把對請求的響應返回給妳。
WSGI:好吧,我等妳。
燒瓶:好了,我說完了。下面是請求的響應結果,請求將結果傳遞給Nginx。WSGI:幹得好!
Nginx,這裏是響應結果,已經按要求傳回給妳了。
Nginx:酷,我收到了,我把響應結果返回給了客戶端。大家合作愉快~