日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Nginx >内容正文

Nginx

如何理解Nginx, WSGI, Flask之间的关系

發布時間:2023/12/20 Nginx 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何理解Nginx, WSGI, Flask之间的关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自:

http://blog.csdn.net/lihao21/article/details/52304119

概覽

之前對 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),這幾者的關系一存存在疑惑。通過查閱了些資料,總算把它們的關系理清了。?
總括來說,客戶端從發送一個 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 框架為例子,展示 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)

    以上簡單的幾行代碼,就創建了一個 web應用程序對象?app。app?監聽機器所有 ip 的 8080 端口,接受用戶的請求連接。我們知道,HTTP 協議使用 URL 來定位資源,上面的程序會將路徑?/hello?的請求交由?hello_world?方法處理,hello_world?返回 ‘Hello World!’ 字符串。對于 web框架的使用者來說,他們并不關心如何接收 HTTP 請求,也不關心如何將請求路由到具體方法處理并將響應結果返回給用戶。Web框架的使用者在大部分情況下,只需要關心如何實現業務的邏輯即可。

    WSGI層

    WSGI 不是服務器,也不是用于與程序交互的API,更不是真實的代碼,WSGI 只是一種接口,它只適用于 Python 語言,其全稱為 Web Server Gateway Interface,定義了 web服務器和 web應用之間的接口規范。也就是說,只要 web服務器和 web應用都遵守WSGI協議,那么 web服務器和 web應用就可以隨意的組合。?
    下面的代碼展示了 web服務器是如何與 web應用組合在一起的。

    def application(env, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return [b"Hello World"]

    方法?application由 web服務器調用,參數env,start_response?由 web服務器實現并傳入。其中,env是一個字典,包含了類似 HTTP_HOST,HOST_USER_AGENT,SERVER_PROTOCO 等環境變量。start_response則是一個方法,該方法接受兩個參數,分別是status,response_headers。application方法的主要作用是,設置 http 響應的狀態碼和 Content-Type 等頭部信息,并返回響應的具體結果。

    上述代碼就是一個完整的 WSGI 應用,當一個支持 WSGI 的 web服務器接收到客戶端的請求后,便會調用這個?application?方法。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框架連接起來。回到本文的題目,Nginx 屬于一種 web服務器,Flask屬于一種 web框架,因此,WSGI 與 Nginx、Flask 的作用就不明而喻了。

    最后以 Nginx,WSGI,Flask 之間的對話結束本文。?
    Nginx:Hey,WSGI,我剛收到了一個請求,我需要你作些準備,然后由Flask來處理這個請求。?
    WSGI:OK,Nginx。我會設置好環境變量,然后將這個請求傳遞給Flask處理。?
    Flask:Thanks WSGI!給我一些時間,我將會把請求的響應返回給你。?
    WSGI:Alright,那我等你。?
    Flask:Okay,我完成了,這里是請求的響應結果,請求把結果傳遞給Nginx。?
    WSGI:Good job!Nginx,這里是響應結果,已經按照要求給你傳遞回來了。?
    Nginx:Cool,我收到了,我把響應結果返回給客戶端。大家合作愉快~

    參考資料:

  • http://hackerxu.com/2015/05/10/flask011.html
  • https://www.quora.com/What-are-good-ways-to-understand-WSGI-flup-fastcgi-CGI-and-Django
  • https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface
  • http://flask.pocoo.org/docs/0.10/quickstart/
  • http://stackoverflow.com/questions/219110/how-python-web-frameworks-wsgi-and-cgi-fit-together
  • https://www.python.org/dev/peps/pep-0333/
  • 《Python核心編程(第3版)》Wesley Chun著
  • 總結

    以上是生活随笔為你收集整理的如何理解Nginx, WSGI, Flask之间的关系的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。