python實(shí)現(xiàn)web應(yīng)用框架之增加響應(yīng)對(duì)象
本篇文章所編寫的代碼,已經(jīng)放到了gitee
上了:gitee.com/pdudo/golea…
本文所依賴的環(huán)境為:
在目前的框架中,我們發(fā)現(xiàn)一個(gè)很惡心的事情,就是沒辦法自定義響應(yīng)頭,我們是直接在框架里面寫死了,可以在myWeb.py
代碼中查看:
所以本篇文章將繼續(xù)編寫web
應(yīng)用框架,將增加一個(gè)響應(yīng)對(duì)象response
。
什么是響應(yīng)對(duì)象
我們是否注意到此前框架的一個(gè)問題,那就是我們只能定義 狀態(tài)碼 和 報(bào)文主體,而且是通過return
的形式返回的,代碼案例如下:
雖然接收客戶端數(shù)據(jù),我們可以通過r
來獲取,但是我們想向客戶端發(fā)送一些內(nèi)容,全部都要通過return
來做,而r
只能獲取客戶端的值,是不是非常不方便呢? 所以我們想效仿flask
框架,做一個(gè)簡(jiǎn)單的響應(yīng)對(duì)象出來,不僅可以接收客戶端參數(shù),還能夠通過其框架自身提供的方法來設(shè)置web
狀態(tài)屬性,例如: headers
等等。
我們?nèi)绾涡略鲰憫?yīng)對(duì)象呢?
是否還記得我們上一篇文章所提及的python
的值傳遞和引用傳遞。我們可以新增一個(gè)類,因?yàn)轭愒?code>python中是引用傳遞的,所以在函數(shù)中對(duì)該值做了任何修改,都會(huì)影響到原先的值。
這里寫一個(gè)類的傳遞案例:
在上述代碼中,我們定義了一個(gè)類叫做className
, 在實(shí)例化為對(duì)象的時(shí)候,需要傳入一個(gè)參數(shù)x
,除此之外,該類還有一個(gè)方法setY
,該方法會(huì)接收一直值y
,并且賦值給self.y
。在主函數(shù)中,我們首先實(shí)例化一個(gè)對(duì)象,傳入數(shù)據(jù)1
,而后將實(shí)例放到函數(shù)modify_class
中,該函數(shù)會(huì)調(diào)用其實(shí)例的setY
方法,上述書傳入一個(gè)99
。而且在函數(shù)執(zhí)行前后,都打印了一下對(duì)象的x
和y
的值。
程序執(zhí)行結(jié)果:
可見,在函數(shù)中傳輸?shù)?code>class對(duì)象,確實(shí)是引用傳遞。
那么如何新增響應(yīng)對(duì)象呢? 我們首先定義一個(gè)類response
用以存放響應(yīng)對(duì)象的信息,而后在每一個(gè)客戶端連接到服務(wù)器后,為每一個(gè)可互換的分配一個(gè)response
對(duì)象,該對(duì)象中我們需要先將wsgi
框架的environ
引入,而后再定義一些常用的方法來存儲(chǔ)web
的狀態(tài)信息,如header
和狀態(tài)碼等。在用戶自定義函數(shù)中,會(huì)對(duì)該值進(jìn)行修改,我們?cè)倨鋱?zhí)行完畢后,由框架收回,進(jìn)行遍歷,修改web
狀態(tài),而后返回客戶端,至此,響應(yīng)對(duì)象執(zhí)行完畢。
新增響應(yīng)對(duì)象代碼編寫
響應(yīng)對(duì)象類的定義
我們先定義響應(yīng)對(duì)象的類,其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
上述代碼,我們定義了一個(gè)類response
,在實(shí)例化為對(duì)象的時(shí)候,需要傳入environ
信息。該類有4個(gè)屬性,分別是:
- response: 客戶端
http
請(qǐng)求信息。 - headers: 返回客戶端的響應(yīng)頭。
- httpcode:
http
狀態(tài)碼。 - regular: 動(dòng)態(tài)路由捕獲到的動(dòng)態(tài)數(shù)據(jù)。
除此之外,還有2個(gè)方法:
- set_headers: 設(shè)置響應(yīng)頭,接收一個(gè)
key
和value
,存儲(chǔ)到self.headers
中。 - status_code: 設(shè)置返回狀態(tài)碼,存儲(chǔ)到
self.httpcode
中。
框架中對(duì)響應(yīng)對(duì)象的解析
如上,我們最簡(jiǎn)單的響應(yīng)對(duì)象類已經(jīng)創(chuàng)建完畢了,現(xiàn)在來看看在wsgi
中應(yīng)該如何編寫以便來存儲(chǔ)該信息。
在wsgi
啟動(dòng)函數(shù)中,我們需要將response
實(shí)例化為對(duì)象,并給將客戶端的environ
傳給實(shí)例,代碼如下:
def application(environ, start_response): r = response(environ)
在生成響應(yīng)報(bào)文headers
的時(shí)候,我們需要將對(duì)象中的headers
取出來,放到列表中,其代碼如下:
headers = [(key,val) for key , val in r.headers.items()]
如上代碼,我們使用使用迭代器實(shí)現(xiàn)遍歷字典,將其存儲(chǔ)到列表中,列表的每個(gè)值類型是元組,元組有2個(gè)數(shù)據(jù),前者是字典的key,后則是字典的value。該數(shù)據(jù)結(jié)構(gòu),也是wsgi
所規(guī)定的。
除此之外,還有很多的細(xì)節(jié),比如,將捕獲到的動(dòng)態(tài)路由信息存儲(chǔ)到regular
中,從httpcode
中讀讀取響應(yīng)狀態(tài)碼,從而返回給客戶端。
對(duì)于使用框架的人而言,如何調(diào)用框架呢? 現(xiàn)在調(diào)用框架實(shí)例如下:
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("捕獲到的動(dòng)態(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)
在上述代碼中,我們不需要為動(dòng)態(tài)路由額外定義形參來接收值了,所有的值由響應(yīng)對(duì)象中獲取,而且還能通過set_headers
來新增headers
,是不是比之前更加方便了呢?
功能測(cè)試
我們已經(jīng)將myWeb.py
編寫好了,這里僅僅編輯main.py
,代碼如下:
我們運(yùn)行代碼后,訪問/ip
和/hello/pdudo
路由嘗試一下:
在查看一下web
服務(wù)器的日志:
可見,增加響應(yīng)對(duì)象成功。
總結(jié)
該篇文章,我們又為我們的web
應(yīng)用框架新增了響應(yīng)對(duì)象,不僅可以設(shè)置heade
,還可以設(shè)置狀態(tài)碼等等,還能夠?qū)⑽覀儾东@到的動(dòng)態(tài)路由名稱加進(jìn)去,這樣用戶在使用該框架的時(shí)候,就不用擔(dān)心裝飾器下的函數(shù)應(yīng)該如何編寫了。
以上就是python web應(yīng)用框架之增加響應(yīng)對(duì)象的詳細(xì)內(nèi)容,更多關(guān)于python增加響應(yīng)對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Django框架之登錄后自定義跳轉(zhuǎn)頁面的實(shí)現(xiàn)方法
這篇文章主要介紹了Django框架之登錄后自定義跳轉(zhuǎn)頁面的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Python 使用Numpy對(duì)矩陣進(jìn)行轉(zhuǎn)置的方法
今天小編就為大家分享一篇Python 使用Numpy對(duì)矩陣進(jìn)行轉(zhuǎn)置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01FFT快速傅里葉變換的python實(shí)現(xiàn)過程解析
這篇文章主要介紹了FFT快速傅里葉變換的python實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10Jinja2實(shí)現(xiàn)模板渲染與訪問對(duì)象屬性流程詳解
要了解jinja2,那么需要先理解模板的概念。模板在Python的web開發(fā)中廣泛使用,它能夠有效的將業(yè)務(wù)邏輯和頁面邏輯分開,使代碼可讀性增強(qiáng),并且更加容易理解和維護(hù)。模板簡(jiǎn)單來說就是一個(gè)其中包含占位變量表示動(dòng)態(tài)部分的文,模板文件在經(jīng)過動(dòng)態(tài)賦值后,返回給用戶2023-03-03Windows下安裝python MySQLdb遇到的問題及解決方法
這篇文章主要介紹了Windows下安裝python MySQLdb遇到的問題及解決方法,需要的朋友可以參考下2017-03-03解決python Jupyter不能導(dǎo)入外部包問題
這篇文章主要介紹了解決python Jupyter不能導(dǎo)入外部包問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04