全面了解Nginx, WSGI, Flask之間的關(guān)系
概覽
之前對 Nginx,WSGI(或者 uWSGI,uwsgi),F(xiàn)lask(或者 Django),這幾者的關(guān)系一存存在疑惑。通過查閱了些資料,總算把它們的關(guān)系理清了。
總括來說,客戶端從發(fā)送一個(gè) HTTP 請求到 Flask 處理請求,分別經(jīng)過了 web服務(wù)器層,WSGI層,web框架層,這三個(gè)層次。不同的層次其作用也不同,下面簡要介紹各層的作用。
web服務(wù)器,web框架與WSGI的三層關(guān)系
圖1:web服務(wù)器,web框架與 WSGI 的三層關(guān)系
Web服務(wù)器層
對于傳統(tǒng)的客戶端 - 服務(wù)器架構(gòu),其請求的處理過程是,客戶端向服務(wù)器發(fā)送請求,服務(wù)器接收請求并處理請求,然后給客戶端返回響應(yīng)。在這個(gè)過程中,服務(wù)器的作用是:
1 接收請求
2 處理請求
3 返回響應(yīng)
Web服務(wù)器是一類特殊的服務(wù)器,其作用是主要是接收 HTTP 請求并返回響應(yīng)。提起 web服務(wù)器大家都不會陌生,常見的 web服務(wù)器有 Nginx,Apache,IIS等。在上圖1的三層結(jié)構(gòu)中,web服務(wù)器是最先接收用戶請求的,并將響應(yīng)結(jié)果返回給用戶。
Web框架層
Web框架的作用主要是方便我們開發(fā) web應(yīng)用程序,HTTP請求的動態(tài)數(shù)據(jù)就是由 web框架層來提供的。常見的 web框架有Flask,Django等,我們以 Flask 框架為例子,展示 web框架的作用:
from flask import Flask app = Flask(__name__) @app.route('/hello') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
以上簡單的幾行代碼,就創(chuàng)建了一個(gè) web應(yīng)用程序?qū)ο?app。app 監(jiān)聽機(jī)器所有 ip 的 8080 端口,接受用戶的請求連接。我們知道,HTTP 協(xié)議使用 URL 來定位資源,上面的程序會將路徑 /hello 的請求交由 hello_world 方法處理,hello_world 返回 ‘Hello World!' 字符串。對于 web框架的使用者來說,他們并不關(guān)心如何接收 HTTP 請求,也不關(guān)心如何將請求路由到具體方法處理并將響應(yīng)結(jié)果返回給用戶。Web框架的使用者在大部分情況下,只需要關(guān)心如何實(shí)現(xiàn)業(yè)務(wù)的邏輯即可。
WSGI層
WSGI 不是服務(wù)器,也不是用于與程序交互的API,更不是真實(shí)的代碼,WSGI 只是一種接口,它只適用于 Python 語言,其全稱為 Web Server Gateway Interface,定義了 web服務(wù)器和 web應(yīng)用之間的接口規(guī)范。也就是說,只要 web服務(wù)器和 web應(yīng)用都遵守WSGI協(xié)議,那么 web服務(wù)器和 web應(yīng)用就可以隨意的組合。
下面的代碼展示了 web服務(wù)器是如何與 web應(yīng)用組合在一起的。
def application(env, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b"Hello World"]
方法 application由 web服務(wù)器調(diào)用,參數(shù)env,start_response 由 web服務(wù)器實(shí)現(xiàn)并傳入。其中,env是一個(gè)字典,包含了類似 HTTP_HOST,HOST_USER_AGENT,SERVER_PROTOCO 等環(huán)境變量。start_response則是一個(gè)方法,該方法接受兩個(gè)參數(shù),分別是status,response_headers。application方法的主要作用是,設(shè)置 http 響應(yīng)的狀態(tài)碼和 Content-Type 等頭部信息,并返回響應(yīng)的具體結(jié)果。
上述代碼就是一個(gè)完整的 WSGI 應(yīng)用,當(dāng)一個(gè)支持 WSGI 的 web服務(wù)器接收到客戶端的請求后,便會調(diào)用這個(gè) application 方法。WSGI 層并不需要關(guān)心env,start_response 這兩個(gè)變量是如何實(shí)現(xiàn)的,就像在 application 里面所做的,直接使用這兩個(gè)變量即可。
值得指出的是,WSGI 是一種協(xié)議,需要區(qū)分幾個(gè)相近的名詞:
uwsgi
同 wsgi 一樣也是一種協(xié)議,uWSGI服務(wù)器正是使用了 uwsgi 協(xié)議
uWSGI
實(shí)現(xiàn)了 uwsgi 和 WSGI 兩種協(xié)議的web服務(wù)器。注意 uWSGI 本質(zhì)上也是一種 web服務(wù)器,處于上面描述的三層結(jié)構(gòu)中的 web服務(wù)器層。
CGI
通用網(wǎng)關(guān)接口,并不限于 Python 語言,定義了 web服務(wù)器是如何向客戶端提供動態(tài)的內(nèi)容。例如,規(guī)定了客戶端如何將參數(shù)傳遞給 web服務(wù)器,web服務(wù)器如何將參數(shù)傳遞給 web應(yīng)用,web應(yīng)用如何將它的輸出如何發(fā)送給客戶端,等等。
生產(chǎn)環(huán)境下的 web應(yīng)用都不使用 CGI 了,CGI進(jìn)程(類似 Python 解釋器)針對每個(gè)請求創(chuàng)建,用完就拋棄,效率低下。WSGI 正是為了替代 CGI 而出現(xiàn)的。
說到這,我們基本理清了 WSGI 在 web服務(wù)器與 web框架之間作用:WSGI 就像一條紐帶,將 web服務(wù)器與 web框架連接起來?;氐奖疚牡念}目,Nginx 屬于一種 web服務(wù)器,F(xiàn)lask屬于一種 web框架,因此,WSGI 與 Nginx、Flask 的作用就不明而喻了。
最后以 Nginx,WSGI,F(xiàn)lask 之間的對話結(jié)束本文。
Nginx:Hey,WSGI,我剛收到了一個(gè)請求,我需要你作些準(zhǔn)備,然后由Flask來處理這個(gè)請求。
WSGI:OK,Nginx。我會設(shè)置好環(huán)境變量,然后將這個(gè)請求傳遞給Flask處理。
Flask:Thanks WSGI!給我一些時(shí)間,我將會把請求的響應(yīng)返回給你。
WSGI:Alright,那我等你。
Flask:Okay,我完成了,這里是請求的響應(yīng)結(jié)果,請求把結(jié)果傳遞給Nginx。
WSGI:Good job!Nginx,這里是響應(yīng)結(jié)果,已經(jīng)按照要求給你傳遞回來了。
Nginx:Cool,我收到了,我把響應(yīng)結(jié)果返回給客戶端。大家合作愉快~
以上這篇全面了解Nginx, WSGI, Flask之間的關(guān)系就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
OpenCV實(shí)現(xiàn)從灰度圖像切出Mask前景區(qū)域
本文主要介紹了如何利用OpenCV實(shí)現(xiàn)從灰度圖像,根據(jù)閾值,切出多個(gè)前景區(qū)域,過濾面積太小的圖像。文中的示例代碼講解詳細(xì),需要的可以參考一下2022-06-06Python單個(gè)項(xiàng)目列表轉(zhuǎn)換為整數(shù)的實(shí)現(xiàn)
本文主要介紹了Python單個(gè)項(xiàng)目列表轉(zhuǎn)換為整數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Flask SQLAlchemy一對一,一對多的使用方法實(shí)踐
Flask-SQLAlchemy一對一,一對多的使用方法實(shí)踐,需要的朋友可以參考下2013-02-02詳解Python中__new__和__init__的區(qū)別與聯(lián)系
在Python中,每個(gè)對象都有兩個(gè)特殊的方法:__new__和__init__,本文將詳細(xì)介紹這兩個(gè)方法的不同之處以及它們之間的聯(lián)系,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-1220行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具
本文主要介紹了Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07使用python實(shí)現(xiàn)多維數(shù)據(jù)降維操作
今天小編就為大家分享一篇使用python實(shí)現(xiàn)多維數(shù)據(jù)降維操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02基于python實(shí)現(xiàn)動態(tài)煙霧效果
動態(tài)煙霧效果常用于游戲和動畫中,為場景增添 逼真的視覺效果,在這篇博客中,我們將使用Python和Pygame庫來創(chuàng)建一個(gè)逼真的煙霧動畫效果,感興趣的小伙伴跟著小編一起來看看吧2024-09-09