国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何理解Nginx, WSGI, Flask之間的關(guān)系

魏明 / 2050人閱讀

摘要:通過查閱了些資料,總算把它們的關(guān)系理清了。在這個(gè)過程中,服務(wù)器的作用是接收請(qǐng)求處理請(qǐng)求返回響應(yīng)服務(wù)器是一類特殊的服務(wù)器,其作用是主要是接收請(qǐng)求并返回響應(yīng)。正是為了替代而出現(xiàn)的。三結(jié)語最后以,,之間的對(duì)話結(jié)束本文。

剛轉(zhuǎn)行互聯(lián)網(wǎng)行業(yè),聽到了許多名詞:Flask、Django、WSGI、 Nginx、Apache等等,一直無法搞清楚這些開源項(xiàng)目之間的關(guān)系,直至看到這篇文章后感覺醍醐灌頂,以下是轉(zhuǎn)載的部分,感謝haozlee分享出這篇文章!


一、概覽

之前對(duì) Nginx,WSGI(或者 uWSGI,uwsgi),F(xiàn)lask(或者 Django),這幾者的關(guān)系一存存在疑惑。通過查閱了些資料,總算把它們的關(guān)系理清了。

總括來說,客戶端從發(fā)送一個(gè) HTTP 請(qǐng)求到 Flask 處理請(qǐng)求,分別經(jīng)過了 web服務(wù)器層,WSGI層,web框架層,這三個(gè)層次。不同的層次其作用也不同,下面簡要介紹各層的作用。


圖1:web服務(wù)器,web框架與 WSGI 的三層關(guān)系

二、 各層作用

1、Web服務(wù)器層

對(duì)于傳統(tǒng)的客戶端 - 服務(wù)器架構(gòu),其請(qǐng)求的處理過程是,客戶端向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器接收請(qǐng)求并處理請(qǐng)求,然后給客戶端返回響應(yīng)。在這個(gè)過程中,服務(wù)器的作用是:
(1)、接收請(qǐng)求
(2)、處理請(qǐng)求
(3)、返回響應(yīng)

Web服務(wù)器是一類特殊的服務(wù)器,其作用是主要是接收 HTTP 請(qǐng)求并返回響應(yīng)。提起 web服務(wù)器大家都不會(huì)陌生,常見的 web服務(wù)器有 Nginx,Apache,IIS等。在上圖1的三層結(jié)構(gòu)中,web服務(wù)器是最先接收用戶請(qǐng)求的,并將響應(yīng)結(jié)果返回給用戶。

2、Web框架層

Web框架的作用主要是方便我們開發(fā) web應(yīng)用程序,HTTP請(qǐng)求的動(dòng)態(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 端口,接受用戶的請(qǐng)求連接。我們知道,HTTP 協(xié)議使用 URL 來定位資源,上面的程序會(huì)將路徑 /hello 的請(qǐng)求交由 hello_world 方法處理,hello_world 返回 ‘Hello World!’ 字符串。對(duì)于 web框架的使用者來說,他們并不關(guān)心如何接收 HTTP 請(qǐng)求,也不關(guān)心如何將請(qǐng)求路由到具體方法處理并將響應(yīng)結(jié)果返回給用戶。Web框架的使用者在大部分情況下,只需要關(guān)心如何實(shí)現(xiàn)業(yè)務(wù)的邏輯即可。

3、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ù)器接收到客戶端的請(qǐng)求后,便會(huì)調(diào)用這個(gè) application 方法。WSGI 層并不需要關(guān)心env,start_response 這兩個(gè)變量是如何實(shí)現(xiàn)的,就像在 application 里面所做的,直接使用這兩個(gè)變量即可。

值得指出的是,WSGI 是一種協(xié)議,需要區(qū)分幾個(gè)相近的名詞:
(1)、uwsgi
同 wsgi 一樣也是一種協(xié)議,uWSGI服務(wù)器正是使用了 uwsgi 協(xié)議
(2)、uWSGI
實(shí)現(xiàn)了 uwsgi 和 WSGI 兩種協(xié)議的web服務(wù)器。注意 uWSGI 本質(zhì)上也是一種 web服務(wù)器,處于上面描述的三層結(jié)構(gòu)中的 web服務(wù)器層。
(3)、CGI
通用網(wǎng)關(guān)接口,并不限于 Python 語言,定義了 web服務(wù)器是如何向客戶端提供動(dòng)態(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 解釋器)針對(duì)每個(gè)請(qǐng)求創(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 的作用就不明而喻了。

三、結(jié)語

最后以 Nginx,WSGI,F(xiàn)lask 之間的對(duì)話結(jié)束本文。

Nginx:Hey,WSGI,我剛收到了一個(gè)請(qǐng)求,我需要你作些準(zhǔn)備,然后由Flask來處理這個(gè)請(qǐng)求。
WSGI:OK,Nginx。我會(huì)設(shè)置好環(huán)境變量,然后將這個(gè)請(qǐng)求傳遞給Flask處理。
Flask:Thanks WSGI!給我一些時(shí)間,我將會(huì)把請(qǐng)求的響應(yīng)返回給你。
WSGI:Alright,那我等你。
Flask:Okay,我完成了,這里是請(qǐng)求的響應(yīng)結(jié)果,請(qǐng)求把結(jié)果傳遞給Nginx。
WSGI:Good job!Nginx,這里是響應(yīng)結(jié)果,已經(jīng)按照要求給你傳遞回來了。
Nginx:Cool,我收到了,我把響應(yīng)結(jié)果返回給客戶端。大家合作愉快~

四、參考資料

(1)、http://hackerxu.com/2015/05/1...
(2)、https://www.quora.com/What-ar...
(3)、https://en.wikipedia.org/wiki...
(4)、http://flask.pocoo.org/docs/0...
(5)、http://stackoverflow.com/ques...
(6)、https://www.python.org/dev/pe...
(7)、《Python核心編程(第3版)》Wesley Chun著

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/39867.html

相關(guān)文章

  • flask route設(shè)計(jì)思路

    摘要:引言本文主要梳理了源碼中的設(shè)計(jì)思路。協(xié)議將處理請(qǐng)求的組件按照功能及調(diào)用關(guān)系分成了三種。不論是什么,最終都會(huì)調(diào)用函數(shù)。 引言 本文主要梳理了flask源碼中route的設(shè)計(jì)思路。首先,從WSGI協(xié)議的角度介紹flask route的作用;其次,詳細(xì)講解如何借助werkzeug庫的Map、Rule實(shí)現(xiàn)route;最后,梳理了一次完整的http請(qǐng)求中route的完整流程。 flask rou...

    vvpale 評(píng)論0 收藏0
  • 深入理解flask框架(1):WSGI與路由

    摘要:是一個(gè)小而美的微框架,主要依賴于和,只建立和的橋梁,前者實(shí)現(xiàn)一個(gè)合適的應(yīng)用,后者處理模板。本文主要分析了是在基礎(chǔ)上如何構(gòu)建接口與路由系統(tǒng)的。網(wǎng)關(guān)協(xié)議的本質(zhì)是為了解耦,實(shí)現(xiàn)服務(wù)器和應(yīng)用程序的分離,就是一個(gè)支持的服務(wù)器與應(yīng)用程序之間的約定。 flask是一個(gè)小而美的微框架,主要依賴于Werkezug 和 Jinja2, Flask 只建立 Werkezug 和 Jinja2 的橋梁,前者實(shí)...

    xiaolinbang 評(píng)論0 收藏0
  • Werkzeug 與 WSGI 介紹

    摘要:在介紹之前,先介紹一下,它為語言定義的服務(wù)器和應(yīng)用程序或框架之間的一種簡單而通用的接口。這個(gè)函數(shù)接受兩個(gè)參數(shù),分別是和。響應(yīng)對(duì)象是一個(gè)應(yīng)用,提供了更好的方法來創(chuàng)建響應(yīng)。這部分解釋來源于官方文檔的中文版。 Werkzeug 是一個(gè)WSGI工具包,也可以作為一個(gè)Web框架的底層庫。 WSGI 在介紹Werkzeug之前,先介紹一下 WSGI(Python Web Server Gate...

    mengera88 評(píng)論0 收藏0
  • flask 源碼解析:簡介

    摘要:簡介官網(wǎng)上對(duì)它的定位是一個(gè)微開發(fā)框架。另外一個(gè)必須理解的概念是,簡單來說就是一套和框架應(yīng)用之間的協(xié)議。功能比較豐富,支持解析自動(dòng)防止攻擊繼承變量過濾器流程邏輯支持代碼邏輯集成等等。那么,從下一篇文章,我們就正式開始源碼之旅了 文章屬于作者原創(chuàng),原文發(fā)布在個(gè)人博客。 flask 簡介 Flask 官網(wǎng)上對(duì)它的定位是一個(gè)微 python web 開發(fā)框架。 Flask is a micro...

    megatron 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

魏明

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<