python實現(xiàn)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í)行前后,都打印了一下對象的x
和y
的值。
程序執(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: 設置響應頭,接收一個
key
和value
,存儲到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增加響應對象的資料請關注腳本之家其它相關文章!
相關文章
Django框架之登錄后自定義跳轉頁面的實現(xiàn)方法
這篇文章主要介紹了Django框架之登錄后自定義跳轉頁面的實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07Windows下安裝python MySQLdb遇到的問題及解決方法
這篇文章主要介紹了Windows下安裝python MySQLdb遇到的問題及解決方法,需要的朋友可以參考下2017-03-03