欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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í)行結果:

可見,在函數(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ù)結構,也是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服務器的日志:

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

總結

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

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

相關文章

  • Python import模塊的緩存問題解決方案

    Python import模塊的緩存問題解決方案

    這篇文章主要介紹了Python import模塊的緩存問題解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Django框架之登錄后自定義跳轉頁面的實現(xiàn)方法

    Django框架之登錄后自定義跳轉頁面的實現(xiàn)方法

    這篇文章主要介紹了Django框架之登錄后自定義跳轉頁面的實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • Python集合add()函數(shù)使用詳解

    Python集合add()函數(shù)使用詳解

    python中add()方法用于給集合添加元素,如果添加的元素在集合中已存在,則不執(zhí)行任何操作,本文將給大家介紹一下Python集合add()函數(shù)使用方法,感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • Python 使用Numpy對矩陣進行轉置的方法

    Python 使用Numpy對矩陣進行轉置的方法

    今天小編就為大家分享一篇Python 使用Numpy對矩陣進行轉置的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • FFT快速傅里葉變換的python實現(xiàn)過程解析

    FFT快速傅里葉變換的python實現(xiàn)過程解析

    這篇文章主要介紹了FFT快速傅里葉變換的python實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Jinja2實現(xiàn)模板渲染與訪問對象屬性流程詳解

    Jinja2實現(xiàn)模板渲染與訪問對象屬性流程詳解

    要了解jinja2,那么需要先理解模板的概念。模板在Python的web開發(fā)中廣泛使用,它能夠有效的將業(yè)務邏輯和頁面邏輯分開,使代碼可讀性增強,并且更加容易理解和維護。模板簡單來說就是一個其中包含占位變量表示動態(tài)部分的文,模板文件在經(jīng)過動態(tài)賦值后,返回給用戶
    2023-03-03
  • Windows下安裝python MySQLdb遇到的問題及解決方法

    Windows下安裝python MySQLdb遇到的問題及解決方法

    這篇文章主要介紹了Windows下安裝python MySQLdb遇到的問題及解決方法,需要的朋友可以參考下
    2017-03-03
  • 用Python輸出一個楊輝三角的例子

    用Python輸出一個楊輝三角的例子

    這篇文章主要介紹了用Python和erlang輸出一個楊輝三角的例子,同時還提供了一個erlang版楊輝三角,需要的朋友可以參考下
    2014-06-06
  • JavaScript嵌入百度地圖API的最詳細方法

    JavaScript嵌入百度地圖API的最詳細方法

    這篇文章主要介紹了JavaScript嵌入百度地圖API的最詳細方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 解決python Jupyter不能導入外部包問題

    解決python Jupyter不能導入外部包問題

    這篇文章主要介紹了解決python Jupyter不能導入外部包問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論