最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年06月07日 11:34:22   作者:山上下了雪-bky  
WSGI(web服務(wù)器網(wǎng)關(guān)接口)主要規(guī)定了服務(wù)器端和應(yīng)用程序之間的接口,即規(guī)定了請求的URL到后臺處理函數(shù)之間的映射該如何實(shí)現(xiàn)。wsgiref是一個幫助開發(fā)者開發(fā)測試的Python內(nèi)置庫,程序員可以通過這個庫了解WSGI的基本運(yùn)行原理,但是不能把它用在生產(chǎn)環(huán)境上。

WSGI基本原理

1. WSGI處理過程

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

2. WSGI示例

wsgiref簡單示例

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

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

# wsgi也是基于socket server編寫
# 默認(rèn)情況下會將所有url都傳入demo_app進(jìn)行處理,具體可參考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)
# 啟動服務(wù)
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設(shè)置響應(yīng)頭信息
    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ù)需要傳入類的實(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服務(wù)器和應(yīng)用程序

WSGI web服務(wù)器

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

WSGI應(yīng)用程序

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

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

相關(guān)文章

  • python 使用值來排序一個字典的方法

    python 使用值來排序一個字典的方法

    這篇文章主要介紹了python 使用值來排序一個字典的方法,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-11-11
  • 在Python中利用pickle保存變量的實(shí)例

    在Python中利用pickle保存變量的實(shí)例

    今天小編就為大家分享一篇在Python中利用pickle保存變量的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 通過實(shí)例解析python描述符原理作用

    通過實(shí)例解析python描述符原理作用

    這篇文章主要介紹了通過實(shí)例解析python描述符原理作用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Django與遺留的數(shù)據(jù)庫整合的方法指南

    Django與遺留的數(shù)據(jù)庫整合的方法指南

    這篇文章主要介紹了Django與遺留的數(shù)據(jù)庫整合的方法指南,Django是最具人氣的Python開發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • python進(jìn)階之協(xié)程你了解嗎

    python進(jìn)階之協(xié)程你了解嗎

    這篇文章主要為大家詳細(xì)介紹了python進(jìn)階之協(xié)程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Python中讀取和加解密PDF文件的詳細(xì)教程

    Python中讀取和加解密PDF文件的詳細(xì)教程

    在Python中讀取和加密PDF文件是一項(xiàng)常見且實(shí)用的任務(wù),尤其對于需要處理大量文檔自動化處理的場景,本文將詳細(xì)介紹如何使用Python讀取PDF文件內(nèi)容以及如何使用不同的庫來給PDF文件加密,需要的朋友可以參考下
    2024-08-08
  • Python使用Qt5實(shí)現(xiàn)水平導(dǎo)航欄的示例代碼

    Python使用Qt5實(shí)現(xiàn)水平導(dǎo)航欄的示例代碼

    本文主要介紹了Python使用Qt5實(shí)現(xiàn)水平導(dǎo)航欄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 老生常談Python之裝飾器、迭代器和生成器

    老生常談Python之裝飾器、迭代器和生成器

    下面小編就為大家?guī)硪黄仙U凱ython之裝飾器、迭代器和生成器。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Python合并多張圖片成PDF

    Python合并多張圖片成PDF

    最近需要將記的筆記整理成一個pdf進(jìn)行保存,所以就研究了一下如何利用Python代碼將拍下來的照片整個合并成一個pdf,感興趣的可以了解一下
    2021-06-06
  • 在Python的Django框架中加載模版的方法

    在Python的Django框架中加載模版的方法

    這篇文章主要介紹了在Python的Django框架中加載模版的方法,是Django使用中的基本操作,需要的朋友可以參考下
    2015-07-07

最新評論

松滋市| 丹凤县| 托克逊县| 年辖:市辖区| 永泰县| 长寿区| 平和县| 崇州市| 余江县| 甘孜| 五指山市| 蛟河市| 五莲县| 衡东县| 昌都县| 曲水县| 西青区| 武城县| 宜川县| 炎陵县| 峨山| 裕民县| 滁州市| 连云港市| 边坝县| 崇信县| 明溪县| 宁武县| 连南| 米林县| 龙游县| 莲花县| 文化| 廉江市| 阿巴嘎旗| 萨迦县| 繁峙县| 本溪市| 江源县| 七台河市| 玉田县|