91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python內置庫wsgiref怎么使用

發布時間:2021-06-07 14:37:57 來源:億速云 閱讀:203 作者:小新 欄目:開發技術

這篇文章主要介紹python內置庫wsgiref怎么使用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

WSGI基本原理

1. WSGI處理過程

python內置庫wsgiref怎么使用

  1. 瀏覽器到WSGI Server:瀏覽器發送的請求會先到WSGI Server。

  2. environ:WSGI Server會將HTTP請求中的參數等信息封裝到environ(一個字典)中。

  3. WSGI Server到WSGI App:App就是我們自己編寫的后臺程序,每個URL會映射到對應的入口處理函數(或其他可調用對象),WSGI Server調用后臺App時,會將environ和WSGI Server中自己的一個start_response函數注入到后臺App中。

  4. 邏輯處理:后臺函數(或其他可調用對象)需要接收environ和start_response,進行邏輯處理后返回一個可迭代對象,可迭代對象中的元素為HTTP正文。

  5. WSGI App到WSGI Server:后臺函數處理完后,會先調用start_response函數將HTTP狀態碼、報文頭等信息(響應頭)返回給WSGI Server,然后再將函數的返回值作為HTTP正文(響應body)返回給WSGI Server。

  6. WSGI Server到瀏覽器:WSGI Server將從App中得到的所有信息封裝為一個response返回給瀏覽器。

2. WSGI示例

wsgiref簡單示例

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

# wsgiref是Python自帶的內置庫,它用來開發者對wsgi進行測試用的,不可以用在生產環境中
from wsgiref.simple_server import make_server, demo_app

# wsgi也是基于socket server編寫
# 默認情況下會將所有url都傳入demo_app進行處理,具體可參考demo_app源碼
# app參數可以是任何可調用對象,但是內部處理需要參考demo_app源碼,即environ處理、start_response調用、返回值類型
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之前需要調用start_response設置響應頭信息
    start_response("200 OK", [('Content-Type','text/plain; charset=utf-8')])
    return [stdout.getvalue().encode("utf-8")]  # 一個可迭代對象,元素為byte類型,元素內容依據start_response中指定的Content-Type來指定

demo_app類定義的兩種方式

# 第一種方式:定義類的__init__和__iter__方法,前者用來接收和處理environ和start_response,后者生成一個可迭代對象
# make_server中app參數只需傳入類名即可
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參數需要傳入類的實例
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服務器

  • 本質上是一個TCP服務器,監聽在特定的端口上。

  • 支持HTTP協議,能夠解析HTTP請求報文,能夠按HTTP協議將響應數據封裝為報文并返回給瀏覽器。

  • 實現了WSGI協議,該協議約定了和應用程序之間的接口,即url到app之間的映射。

WSGI應用程序

  • 遵從WSGI協議。

  • 本身是一個可調用對象。

  • 調用start_response,返回響應頭部。

  • 返回包含正文的可迭代對象。

以上是“python內置庫wsgiref怎么使用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五家渠市| 七台河市| 平凉市| 濮阳市| 古蔺县| 北流市| 金华市| 商都县| 仁怀市| 本溪市| 沙河市| 紫金县| 松溪县| 贵定县| 磐石市| 新宁县| 张掖市| 肃北| 温泉县| 延吉市| 城固县| 广西| 黑龙江省| 富阳市| 蒙城县| 吴江市| 原阳县| 北宁市| 石林| 巴中市| 池州市| 滨海县| 米泉市| 万源市| 金湖县| 班玛县| 张家界市| 克山县| 丁青县| 建湖县| 昭平县|