佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > python 內(nèi)置庫wsgiref的使用(WSGI基礎入門)

python 內(nèi)置庫wsgiref的使用(WSGI基礎入門)

熱門標簽:網(wǎng)站文章發(fā)布 服務器配置 美圖手機 銀行業(yè)務 呼叫中心市場需求 鐵路電話系統(tǒng) 檢查注冊表項 智能手機

WSGI基本原理

1. WSGI處理過程

  1. 瀏覽器到WSGI Server:瀏覽器發(fā)送的請求會先到WSGI Server。
  2. environ:WSGI Server會將HTTP請求中的參數(shù)等信息封裝到environ(一個字典)中。
  3. WSGI Server到WSGI App:App就是我們自己編寫的后臺程序,每個URL會映射到對應的入口處理函數(shù)(或其他可調(diào)用對象),WSGI Server調(diào)用后臺App時,會將environ和WSGI Server中自己的一個start_response函數(shù)注入到后臺App中。
  4. 邏輯處理:后臺函數(shù)(或其他可調(diào)用對象)需要接收environ和start_response,進行邏輯處理后返回一個可迭代對象,可迭代對象中的元素為HTTP正文。
  5. WSGI App到WSGI Server:后臺函數(shù)處理完后,會先調(diào)用start_response函數(shù)將HTTP狀態(tài)碼、報文頭等信息(響應頭)返回給WSGI Server,然后再將函數(shù)的返回值作為HTTP正文(響應body)返回給WSGI Server。
  6. WSGI Server到瀏覽器:WSGI Server將從App中得到的所有信息封裝為一個response返回給瀏覽器。

2. WSGI示例

wsgiref簡單示例

運行以下示例程序后,在瀏覽器中輸入以http://127.0.0.1:9999/開頭的隨意一個url都可以看到返回結果。實例程序中所有url都會以同一個App進行處理,實際生產(chǎn)環(huán)境中不同的url肯定是需要映射到不同的App上的,但這部分本文不作講解。

# wsgiref是Python自帶的內(nèi)置庫,它用來開發(fā)者對wsgi進行測試用的,不可以用在生產(chǎn)環(huán)境中
from wsgiref.simple_server import make_server, demo_app

# wsgi也是基于socket server編寫
# 默認情況下會將所有url都傳入demo_app進行處理,具體可參考demo_app源碼
# app參數(shù)可以是任何可調(diào)用對象,但是內(nèi)部處理需要參考demo_app源碼,即environ處理、start_response調(diào)用、返回值類型
ws = make_server('127.0.0.1', 9999, demo_app)
# 啟動服務
ws.serve_forever()

demo_app源碼

def demo_app(environ,start_response):
    from io import StringIO
    stdout = StringIO()
    print("Hello world!", file=stdout)
    print(file=stdout)
    # environ是一個字典,包含了所有請求信息
    h = sorted(environ.items())
    for k,v in h:
        print(k,'=',repr(v), file=stdout)
    # return之前需要調(diào)用start_response設置響應頭信息
    start_response("200 OK", [('Content-Type','text/plain; charset=utf-8')])
    return [stdout.getvalue().encode("utf-8")]  # 一個可迭代對象,元素為byte類型,元素內(nèi)容依據(jù)start_response中指定的Content-Type來指定

demo_app類定義的兩種方式

# 第一種方式:定義類的__init__和__iter__方法,前者用來接收和處理environ和start_response,后者生成一個可迭代對象
# make_server中app參數(shù)只需傳入類名即可
class ApplicationClass:
    def __init__(self, environ, start_response):
        self.e = environ
        self.sr = start_response
        
    def __iter__(self):
        from io import StringIO
        stdout = StringIO()
        print("Hello world!", file=stdout)
        print(file=stdout)
        h = sorted(self.e.items())
        for k, v in h:
            print(k, '=', repr(v), file=stdout)
        self.sr("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
        yield from [stdout.getvalue().encode("utf-8")]
        
        
# 第二種方式:定義__call__方法,接收和處理environ和start_response,并返回一個可迭代對象
# make_server中app參數(shù)需要傳入類的實例
class ApplicationInstance:
    def __call__(self, environ, start_response):
        from io import StringIO
        stdout = StringIO()
        print("Hello world!", file=stdout)
        print(file=stdout)
        h = sorted(environ.items())
        for k, v in h:
            print(k, '=', repr(v), file=stdout)
        start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
        return [stdout.getvalue().encode("utf-8")]

3. WSGI web服務器和應用程序

WSGI web服務器

  • 本質(zhì)上是一個TCP服務器,監(jiān)聽在特定的端口上。
  • 支持HTTP協(xié)議,能夠解析HTTP請求報文,能夠按HTTP協(xié)議將響應數(shù)據(jù)封裝為報文并返回給瀏覽器。
  • 實現(xiàn)了WSGI協(xié)議,該協(xié)議約定了和應用程序之間的接口,即url到app之間的映射。

WSGI應用程序

  • 遵從WSGI協(xié)議。
  • 本身是一個可調(diào)用對象。
  • 調(diào)用start_response,返回響應頭部。
  • 返回包含正文的可迭代對象。

以上就是python 內(nèi)置庫wsgiref的使用(WSGI基礎入門)的詳細內(nèi)容,更多關于python wsgiref的使用的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Python實現(xiàn)socket庫網(wǎng)絡通信套接字
  • Python標準庫之typing的用法(類型標注)
  • Python趣味挑戰(zhàn)之turtle庫繪畫飄落的銀杏樹
  • 讓文件路徑提取變得更簡單的Python Path庫
  • 關于python3安裝pip及requests庫的導入問題
  • Python的這些庫,你知道多少?

標簽:紅河 上海 長治 沈陽 滄州 河南 新疆 樂山

巨人網(wǎng)絡通訊聲明:本文標題《python 內(nèi)置庫wsgiref的使用(WSGI基礎入門)》,本文關鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    海兴县| 自贡市| 吉安县| 甘肃省| 拉孜县| 清涧县| 古丈县| 新昌县| 沙湾县| 夏津县| 塔河县| 南充市| 新晃| 四子王旗| 红河县| 旌德县| 饶平县| 泽州县| 略阳县| 砚山县| 永登县| 乐东| 邯郸县| 岚皋县| 石棉县| 金秀| 威远县| 小金县| 吉水县| 高淳县| 温宿县| 拉萨市| 綦江县| 上虞市| 黄大仙区| 论坛| 南丹县| 石嘴山市| 涪陵区| 南部县| 汉源县|