婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Python WSGI 規范簡介

Python WSGI 規范簡介

熱門標簽:電話機器人貸款詐騙 蘇州人工外呼系統軟件 電話外呼系統招商代理 廣東旅游地圖標注 佛山通用400電話申請 打印谷歌地圖標注 京華圖書館地圖標注 看懂地圖標注方法 淮安呼叫中心外呼系統如何

作為 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 框架,在框架內部處理請求邏輯后,會將響應信息按照原路返回。

你可能會問,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 os


def 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 OK
response_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 the
        WSGI application. This calls :meth:`wsgi_app`, which can be
        wrapped to apply middleware.
        """
        return self.wsgi_app(environ, start_response)

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

以上就是Python WSGI 規范簡介的詳細內容,更多關于Python WSGI 規范的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • python wsgiref源碼解析
  • 淺析Python 中的 WSGI 接口和 WSGI 服務的運行
  • Docker構建python Flask+ nginx+uwsgi容器
  • python 解決flask uwsgi 獲取不到全局變量的問題
  • python web框架 django wsgi原理解析
  • VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法詳解
  • Python開發之Nginx+uWSGI+virtualenv多項目部署教程
  • CentOS7部署Flask(Apache、mod_wsgi、Python36、venv)
  • 詳解如何在Apache中運行Python WSGI應用
  • python 內置庫wsgiref的使用(WSGI基礎入門)

標簽:中山 股票 江蘇 呼和浩特 衡水 畢節 駐馬店 湖州

巨人網絡通訊聲明:本文標題《Python WSGI 規范簡介》,本文關鍵詞  Python,WSGI,規范,簡介,Python,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python WSGI 規范簡介》相關的同類信息!
  • 本頁收集關于Python WSGI 規范簡介的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 泽州县| 锦州市| 安陆市| 汝城县| 古田县| 桐庐县| 苏州市| 渝北区| 宁晋县| 民县| 海伦市| 合山市| 峨眉山市| 开阳县| 荆门市| 泾阳县| 克山县| 洞头县| 如皋市| 靖边县| 河津市| 阳高县| 新乡市| 宜兰市| 阿图什市| 尖扎县| 玉屏| 南宫市| 磐安县| 且末县| 阿鲁科尔沁旗| 宁晋县| 白沙| 英吉沙县| 南通市| 保定市| 通城县| 灵璧县| 寿阳县| 东城区| 安溪县|