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

python實現(xiàn)web應用框架之增加響應對象

 更新時間:2023年05月06日 08:44:07   作者:真的不能告訴你我的名字  
這篇文章主要介紹了python利用web應用框架如何增加響應對象的,文中有相應的代碼示例,對大家的學習或工作有一定的參考價值,需要的同學可以參考下

本篇文章所編寫的代碼,已經(jīng)放到了gitee上了:gitee.com/pdudo/golea…

本文所依賴的環(huán)境為:

在目前的框架中,我們發(fā)現(xiàn)一個很惡心的事情,就是沒辦法自定義響應頭,我們是直接在框架里面寫死了,可以在myWeb.py代碼中查看:

所以本篇文章將繼續(xù)編寫web應用框架,將增加一個響應對象response。

什么是響應對象

我們是否注意到此前框架的一個問題,那就是我們只能定義 狀態(tài)碼 和 報文主體,而且是通過return的形式返回的,代碼案例如下:

雖然接收客戶端數(shù)據(jù),我們可以通過r來獲取,但是我們想向客戶端發(fā)送一些內(nèi)容,全部都要通過return來做,而r只能獲取客戶端的值,是不是非常不方便呢? 所以我們想效仿flask框架,做一個簡單的響應對象出來,不僅可以接收客戶端參數(shù),還能夠通過其框架自身提供的方法來設置web狀態(tài)屬性,例如: headers等等。

我們?nèi)绾涡略鲰憫獙ο竽兀?/h2>

是否還記得我們上一篇文章所提及的python的值傳遞和引用傳遞。我們可以新增一個類,因為類在python中是引用傳遞的,所以在函數(shù)中對該值做了任何修改,都會影響到原先的值。

這里寫一個類的傳遞案例:

在上述代碼中,我們定義了一個類叫做className, 在實例化為對象的時候,需要傳入一個參數(shù)x,除此之外,該類還有一個方法setY,該方法會接收一直值y,并且賦值給self.y。在主函數(shù)中,我們首先實例化一個對象,傳入數(shù)據(jù)1,而后將實例放到函數(shù)modify_class中,該函數(shù)會調(diào)用其實例的setY方法,上述書傳入一個99。而且在函數(shù)執(zhí)行前后,都打印了一下對象的xy的值。

程序執(zhí)行結(jié)果:

可見,在函數(shù)中傳輸?shù)?code>class對象,確實是引用傳遞。

那么如何新增響應對象呢? 我們首先定義一個類response用以存放響應對象的信息,而后在每一個客戶端連接到服務器后,為每一個可互換的分配一個response對象,該對象中我們需要先將wsgi框架的environ引入,而后再定義一些常用的方法來存儲web的狀態(tài)信息,如header和狀態(tài)碼等。在用戶自定義函數(shù)中,會對該值進行修改,我們再其執(zhí)行完畢后,由框架收回,進行遍歷,修改web狀態(tài),而后返回客戶端,至此,響應對象執(zhí)行完畢。

新增響應對象代碼編寫

響應對象類的定義

我們先定義響應對象的類,其response類代碼如下:

class response():
    def __init__(self,environ):
        self.response = environ
        self.headers = {}
        self.httpcode = 200
        self.regular = ()

    def set_headers(self,key,val):
        if key and val:
            self.headers[key] = val
        else:
            raise ValueError("set header , Key or val is empty")

    def status_code(self,code):
        self.httpcode = code

上述代碼,我們定義了一個類response,在實例化為對象的時候,需要傳入environ信息。該類有4個屬性,分別是:

  • response: 客戶端http請求信息。
  • headers: 返回客戶端的響應頭。
  • httpcode: http狀態(tài)碼。
  • regular: 動態(tài)路由捕獲到的動態(tài)數(shù)據(jù)。

除此之外,還有2個方法:

  • set_headers: 設置響應頭,接收一個keyvalue,存儲到self.headers中。
  • status_code: 設置返回狀態(tài)碼,存儲到self.httpcode中。

框架中對響應對象的解析

如上,我們最簡單的響應對象類已經(jīng)創(chuàng)建完畢了,現(xiàn)在來看看在wsgi中應該如何編寫以便來存儲該信息。

wsgi啟動函數(shù)中,我們需要將response實例化為對象,并給將客戶端的environ傳給實例,代碼如下:

def application(environ, start_response):
	r = response(environ)

在生成響應報文headers的時候,我們需要將對象中的headers取出來,放到列表中,其代碼如下:

headers = [(key,val) for key , val in r.headers.items()]

如上代碼,我們使用使用迭代器實現(xiàn)遍歷字典,將其存儲到列表中,列表的每個值類型是元組,元組有2個數(shù)據(jù),前者是字典的key,后則是字典的value。該數(shù)據(jù)結(jié)構,也是wsgi所規(guī)定的。

除此之外,還有很多的細節(jié),比如,將捕獲到的動態(tài)路由信息存儲到regular中,從httpcode中讀讀取響應狀態(tài)碼,從而返回給客戶端。

對于使用框架的人而言,如何調(diào)用框架呢? 現(xiàn)在調(diào)用框架實例如下:

import myWeb

@myWeb.routes(path="/ip",methods="all")
def indx(r):
    print(r.response["REMOTE_ADDR"])
    return r.response["REMOTE_ADDR"]

@myWeb.routes(path="/hello/{name}",methods="get",regular=True)
def helloWold(r):
    name = r.regular
    print("捕獲到的動態(tài)路由值: " , r.regular)
    r.set_headers("Server", "pdudo_web_sites")
    r.set_headers("Content-type", "text/html")
    r.httpcode = 200

    return "hello %s" % (name)

在上述代碼中,我們不需要為動態(tài)路由額外定義形參來接收值了,所有的值由響應對象中獲取,而且還能通過set_headers來新增headers,是不是比之前更加方便了呢?

功能測試

我們已經(jīng)將myWeb.py編寫好了,這里僅僅編輯main.py,代碼如下:

我們運行代碼后,訪問/ip/hello/pdudo路由嘗試一下:

在查看一下web服務器的日志:

可見,增加響應對象成功。

總結(jié)

該篇文章,我們又為我們的web應用框架新增了響應對象,不僅可以設置heade,還可以設置狀態(tài)碼等等,還能夠?qū)⑽覀儾东@到的動態(tài)路由名稱加進去,這樣用戶在使用該框架的時候,就不用擔心裝飾器下的函數(shù)應該如何編寫了。

以上就是python web應用框架之增加響應對象的詳細內(nèi)容,更多關于python增加響應對象的資料請關注腳本之家其它相關文章!

相關文章

  • pytorch 實現(xiàn)在預訓練模型的 input上增減通道

    pytorch 實現(xiàn)在預訓練模型的 input上增減通道

    今天小編就為大家分享一篇pytorch 實現(xiàn)在預訓練模型的 input上增減通道,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python語法學習print中f-string用法示例

    python語法學習print中f-string用法示例

    這篇文章主要為大家介紹了python語法學習print中f-string用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • python裝飾器代碼解析

    python裝飾器代碼解析

    這篇文章主要介紹了python裝飾器代碼解析,文章分享的內(nèi)容有裝飾器通用模型及一些關鍵點,通過舉例詳細介紹,具有一的參考價值,需要的朋友可以參考一下
    2022-03-03
  • Python如何對接文心一言

    Python如何對接文心一言

    這篇文章主要為大家介紹了Python如何對接文心一言的操作實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Django框架中數(shù)據(jù)的連鎖查詢和限制返回數(shù)據(jù)的方法

    Django框架中數(shù)據(jù)的連鎖查詢和限制返回數(shù)據(jù)的方法

    這篇文章主要介紹了Django框架中數(shù)據(jù)的連鎖查詢和限制返回數(shù)據(jù)的方法,Django是Python重多高人氣框架中最為著名的一個,需要的朋友可以參考下
    2015-07-07
  • Python編寫屏幕網(wǎng)格生成工具

    Python編寫屏幕網(wǎng)格生成工具

    這篇文章主要為大家詳細介紹了如何通過Python編寫屏幕網(wǎng)格生成工具,可以定期繪制一個透明的網(wǎng)格,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • Python3數(shù)據(jù)庫操作包pymysql的操作方法

    Python3數(shù)據(jù)庫操作包pymysql的操作方法

    這篇文章主要介紹了Python3數(shù)據(jù)庫操作包pymysql的操作方法,文章通過實例代碼相結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下
    2018-07-07
  • python使用正則表達式的search()函數(shù)實現(xiàn)指定位置搜索功能

    python使用正則表達式的search()函數(shù)實現(xiàn)指定位置搜索功能

    SEARCH函數(shù),函數(shù)名。主要用來返回指定的字符串在原始字符串中首次出現(xiàn)的位置 ,從左到右查找,忽略英文字母的大小寫。接下來通過本文給大家介紹python使用正則表達式的search()函數(shù)實現(xiàn)指定位置搜索功能,需要的朋友一起看看吧
    2017-11-11
  • python文件寫入write()的操作

    python文件寫入write()的操作

    這篇文章主要介紹了python文件寫入write()的操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • 如何利用Python和OpenCV對圖像進行加水印詳解

    如何利用Python和OpenCV對圖像進行加水印詳解

    Python使用opencv是因為覺得它足夠強大,很多圖像處理這塊都是用的它,最近就用opencv添加個水印,這篇文章主要給大家介紹了關于如何利用Python和OpenCV對圖像進行加水印的相關資料,需要的朋友可以參考下
    2021-10-10

最新評論

琼结县| 广东省| 时尚| 武山县| 府谷县| 喜德县| 启东市| 东莞市| 龙井市| 五峰| 老河口市| 望谟县| 沅陵县| 志丹县| 金华市| 密云县| 衢州市| 安陆市| 阿克陶县| 梁平县| 浦城县| 乐业县| 巴楚县| 永定县| 濮阳市| 芒康县| 西盟| 克东县| 桂平市| 武定县| 科尔| 双鸭山市| 太和县| 蒙山县| 临沂市| 平阴县| 平和县| 永和县| 共和县| 大英县| 高淳县|