色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

Python WSGI 規范簡介

瀏覽:10日期:2022-06-22 17:27:27

作為 Python Web 開發者來說,在開發程序階段一般是不會接觸到 WSGI 這個名詞的,但當程序開發完成,考慮上線部署的時候,WSGI 規范是一個繞不開的話題,本文將介紹何為 WSGI。

WSGI 全拼 Web Server Gateway Interface,是為 Python 語言定義的 Web 服務器和 Web 應用程序(或框架)之間的一種通用編程接口。翻譯成白話就是說 WSGI 是一個協議,就像 HTTP 協議定義了客戶端和服務端數據傳輸的規范,WSGI 協議定義了 Web 服務器和 Web 應用程序之間協同工作的規范。

Python Web 應用部署方案

Flask 或 Django 等 Web 框架都提供了內置的 Web Server,本地開發階段可以使用 flask run 或 python manage.py runserver 來分別啟動 Flask 或 Django 內置的 Server。

在生產環境部署應用時,通常不會使用框架內置的 Server,而是使用 Gunicorn 或 uWSGI 來部署,以獲得更好的性能。部署過 Python Web 應用的同學應該對如下部署架構有所了解,左側是瀏覽器,右側是服務器。在服務器內部,首先通過 Nginx 來監聽 80/443 端口,當接收到來自客戶端的請求時,Nginx 會將請求轉發到監聽 5000 端口的 Gunicorn/uWSGI Server,接著請求會通過 WSGI 協議被傳遞到 Flask/Django 框架,在框架內部處理請求邏輯后,會將響應信息按照原路返回。

Python WSGI 規范簡介

你可能會問,Nginx 性能很高,為什么不將應用直接部署到 Nginx 上,而是中間通過 Gunicorn/uWSGI 做一層轉發呢?因為 Nginx 沒有遵循 WSGI 規范,并不能像 Gunicorn/uWSGI 這樣很容易的與 Flask/Django 框架結合起來。

WSGI 規范

根據 Python Web 應用部署架構,我們知道了 WSGI 所處的位置,接下來看下 WSGI 規范具體定義了哪些內容。

如同 HTTP 協議有一個客戶端和一個服務端,WSGI 協議有一個 Application 端和一個 Server 端,其中 Application 就是指 Flask、Django 這些 Web 框架,而 Server 就是指 Gunicorn、uWSGI 等 Web 服務器。

WSGI 協議規定 Application 端需要實現成一個可調用對象(函數、類等),其接口如下:

def simple_app(environ, start_response): status = ’200 OK’ response_headers = [(’Content-type’, ’text/plain’)] start_response(status, response_headers) return [’Hello world!n’]

simple_app 就是一個最簡單的 Application,它需要接收兩個參數,environ 是一個 dict,其中保存了所有 HTTP 請求相關的信息,由 Server 端提供,start_response 是一個可調用對象,同樣由 Server 端提供,simple_app內部需要調用一次 start_response,并將 狀態碼 和 響應頭 當作參數傳遞給它,simple_app 最終會返回一個可迭代對象作為 HTTP Body 內容返回給客戶端。

我們已經知道了 Application 端接口,接下來看下一個符合 WSGI 協議的 Server 端實現:

import osdef wsgi_server(application): environ = dict(os.environ.items()) def start_response(status, response_headers):print(f’status: {status}’)print(f’response_headers: {response_headers}’) result = application(environ, start_response) for data in result:print(f’response_body: {data}’)

示例中 Server 端同樣使用函數來實現,wsgi_server 接收一個 application 作為參數,在其內部構造了 environ 和 start_response 兩個對象,這里使用環境變量信息來模擬 HTTP 請求信息構造 environ 字典,start_response 同樣被定義為一個函數,供 application 在內部對其進行調用,wsgi_server 函數最后會調用 application 并對其進行打印。

現在有了 Application 端和 Server 端,我們可以來測試一下這個簡單的 WSGI 程序示例。只需要將 simple_app 作為參數傳遞給 wsgi_server 并調用 wsgi_server 即可:

wsgi_server(simple_app)

執行以上代碼,將得到如下打印:

status: 200 OKresponse_headers: [(’Content-type’, ’text/plain’)]response_body: Hello world!

以上,我們分別實現了符合 WSGI 規范的 Application 端和 Server 端,雖然程序看起來比較簡陋,但不論多么復雜的 Python Web 框架和 Server 都同樣遵循此規范。

WSGI 實際應用

學習了 WSGI 規范,我們可以來驗證下平時使用的 Python Web 框架是否真的遵循此規范,這里以 Flask 框架源碼為例,可以在 https://github.com/pallets/flask/blob/master/src/flask/app.py 查看 Flask 的定義:

class Flask(Scaffold): ... def __call__(self, environ, start_response):'''The WSGI server calls the Flask application object as theWSGI application. This calls :meth:`wsgi_app`, which can bewrapped to apply middleware.'''return self.wsgi_app(environ, start_response)

Flask 類內部通過實現 __call__ 方法,使得 Flask 實例對象成為一個可調用對象,其接口實現同樣符合 WSGI Application 規范。

以上就是Python WSGI 規范簡介的詳細內容,更多關于Python WSGI 規范的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 国产一区二区三区免费 | 欧美1 | 日本一级特黄aa毛片免费观看 | 亚洲 欧美 精品 | 亚洲精品在线免费观看视频 | 久久91精品国产一区二区 | 美女张开腿让男人捅的视频 | 91欧洲在线视精品在亚洲 | 欧美人交性视频在线香蕉 | 女人张开腿让男人桶免费最新 | 中文偷拍视频在线观看 | 亚洲系列 | 一级片在线观看 | 日本午夜高清视频 | 草草视频在线观看最新 | 九九热视频在线免费观看 | 国产1级片 | 99午夜高清在线视频在观看 | 亚洲国产精品看片在线观看 | 天堂在线视频网站 | 一级女性黄 色生活片 | 91欧洲在线视精品在亚洲 | 国产精品女上位在线观看 | 免费一级毛片私人影院a行 免费一级毛片无毒不卡 | 欧美一级二级三级 | 国产区香蕉精品系列在线观看不卡 | 日韩欧美毛片免费观看视频 | 狠狠做久久深爱婷婷97动漫 | 日本一级毛片在线看 | 欧美怡红院免费全视频 | 欧美精品人爱c欧美精品 | a欧美在线 | 在线视频一区二区日韩国产 | 免费观看欧美精品成人毛片能看的 | 亚洲人成在线精品 | 狼人 成人 综合 亚洲 | 免费看欧美日韩一区二区三区 | 欧美一区二区aa大片 | 中文字幕日本一区波多野不卡 | 国产成人精品久久二区二区 | 国产精品91在线 |