當前位置:吉日网官网 - 油畫收藏 - 如何理解Nginx、uWSGI和Flask的關系

如何理解Nginx、uWSGI和Flask的關系

總之,客戶端從發送HTTP請求到Flask處理請求,要經過三個層次:web服務器層、WSGI層和web框架層。不同的層次有不同的功能,下面簡單介紹壹下各層的功能。

圖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:酷,我收到了,我把響應結果返回給了客戶端。大家合作愉快~

  • 上一篇:好看經典的古言小說。不虐完結非小白
  • 下一篇:季羅月的三大養護技巧,快樂生長,換上色彩鮮艷的老樁,美麗度過夏冬。
  • copyright 2024吉日网官网