Sanic框架異常處理與中間件操作實(shí)例分析
本文實(shí)例講述了Sanic框架異常處理與中間件操作。分享給大家供大家參考,具體如下:
簡(jiǎn)介
Sanic是一個(gè)類(lèi)似Flask的Python 3.5+ Web服務(wù)器,它的寫(xiě)入速度非??臁3薋lask之外,Sanic還支持異步請(qǐng)求處理程序。這意味著你可以使用Python 3.5中新的閃亮的異步/等待語(yǔ)法,使你的代碼非阻塞和快速。
前言:Sanic最低支持Python 3.5,如果需要學(xué)習(xí)Sanic,請(qǐng)先下載版本不低于3.5的Python包
異常
異常可以從請(qǐng)求處理程序中拋出,并由Sanic自動(dòng)處理。異常將消息作為第一個(gè)參數(shù),并且還可以將狀態(tài)碼傳回HTTP響應(yīng)中。
拋出異常:手動(dòng)產(chǎn)生異常的方式,有過(guò)Python基礎(chǔ)的都知道,可以使用raise來(lái)產(chǎn)生一個(gè)異常:
from sanic.exceptions import ServerError
from sanic.response import text
@app.route("/get_exception")
async def get_exception(request):
raise ServerError("it is error",status_code=500)
你也可以使用abort:
from sanic.exceptions import abort
from sanic.response import text
@app.route("/get_exception")
async def get_exception(request):
abort(402)
text("ok")
處理異常:有時(shí)我們需要對(duì)一些特殊異常做特殊處理,此時(shí)我們可以用到@app.exception裝飾器,然后在定義一個(gè)異常函數(shù)來(lái)進(jìn)行處理。異常裝飾器處理函數(shù)必須以一個(gè)Request和Exception對(duì)象作為參數(shù):
from sanic.response import text
from sanic.exceptions import NotFound
@app.exception(NotFound)
async def not_found_exception(request,exception):
return text("not found=>{}".format(request.url))
中間件
中間件是服務(wù)器在請(qǐng)求之前或之后執(zhí)行的功能,他們可以用來(lái)修改修改用戶定義處理函數(shù)的請(qǐng)求或相應(yīng)。Sanic提供兩種類(lèi)型的中間件:請(qǐng)求和響應(yīng)。兩者都是使用@app.middleware裝飾器聲明,兩個(gè)裝飾器分別需要傳入一個(gè)代表其類(lèi)型的參數(shù):request和response,下面舉一個(gè)簡(jiǎn)單的栗子:
from sanic.response import text
@app.route("/get_info")
async def get_info(request):
print(request.url)
return text("it is ok!")
@app.middleware("request")
async def get_request_middleware(request):
print("請(qǐng)求中間件")
@app.middleware("response")
async def get_response_middleware(request,response):
print("響應(yīng)中間件")
當(dāng)我們?cè)L問(wèn)/get_info請(qǐng)求時(shí),打印結(jié)果將會(huì)是這樣的:
請(qǐng)求中間件
http://localhost:5000/get_info
響應(yīng)中間件
值得注意的是,如果是響應(yīng)中間的處理函數(shù),除了需要傳遞一個(gè)request對(duì)象參數(shù),還需要傳遞一個(gè)response對(duì)象參數(shù)。從結(jié)果可以看出,request中間件是在接收到請(qǐng)求時(shí)立馬觸發(fā)的,而response中間件是在接收到響應(yīng)時(shí)立馬觸發(fā)的。針對(duì)這兩者的特性,我們可以進(jìn)行一些特殊的操作,來(lái)達(dá)到我們的目的:
@app.middleware("request")
async def get_request_middleware(request):
request.args.update({"name":"laozhang"})
@app.middleware("response")
async def get_response_middleware(request,response):
response.headers["name"] = "laozhang"
將所有的請(qǐng)求的args添加一條name=laozhang,并且在響應(yīng)頭中添加name=laozhang
監(jiān)聽(tīng)器
如果需要在服務(wù)器啟動(dòng)/關(guān)閉的時(shí)候,執(zhí)行一些特殊的代碼,則可以使用以下監(jiān)聽(tīng)器:
- before_server_start:在服務(wù)器啟動(dòng)之前執(zhí)行
- after_server_start:在服務(wù)器啟動(dòng)之后執(zhí)行
- before_server_stop:在服務(wù)器關(guān)閉之前執(zhí)行
- after_server_stop:在服務(wù)器關(guān)閉之后執(zhí)行
舉個(gè)栗子:
@app.listener("before_server_start")
async def before_server_start(request,loop):
print("before_server_start")
@app.listener("after_server_start")
async def after_server_start(request,loop):
print("after_server_start")
@app.listener("before_server_stop")
async def before_server_stop(request,loop):
print("before_server_stop")
@app.listener("after_server_stop")
async def after_server_stop(request,loop):
print("after_server_stop")
現(xiàn)在先啟動(dòng)服務(wù),而后關(guān)閉,發(fā)現(xiàn)執(zhí)行的順序?qū)?huì)是這樣:
before_server_start
after_server_start
before_server_stop
after_server_stop
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專(zhuān)題:《Python入門(mén)與進(jìn)階經(jīng)典教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
如何通過(guò)python實(shí)現(xiàn)人臉識(shí)別驗(yàn)證
這篇文章主要介紹了如何通過(guò)python實(shí)現(xiàn)人臉識(shí)別驗(yàn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Pycharm中SQL語(yǔ)句提示SQL Dialect is Not Config
這篇文章主要介紹了Pycharm中SQL語(yǔ)句提示SQL Dialect is Not Configured的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-07-07
TensorFlow梯度求解tf.gradients實(shí)例
今天小編就為大家分享一篇TensorFlow梯度求解tf.gradients實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python腳本之一鍵移動(dòng)自定格式文件方法實(shí)例
這篇文章主要給大家介紹了關(guān)于python腳本之一鍵移動(dòng)自定格式文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Python利用py-redis實(shí)現(xiàn)分布式鎖
隨著業(yè)務(wù)的增長(zhǎng),后端技術(shù)架構(gòu)會(huì)慢慢的從單體服務(wù)轉(zhuǎn)向多服務(wù)或者微服務(wù)的分布式架構(gòu),本文主要為大家介紹了如何利用Py-Redis實(shí)現(xiàn)簡(jiǎn)單的分布式鎖,需要的可以參考一下2023-08-08
python GUI實(shí)現(xiàn)小球滿屏亂跑效果
這篇文章主要為大家詳細(xì)介紹了python GUI實(shí)現(xiàn)小球滿屏亂跑效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
基于python實(shí)現(xiàn)rpc遠(yuǎn)程過(guò)程調(diào)用
本文主要介紹了基于python實(shí)現(xiàn)rpc遠(yuǎn)程過(guò)程調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Python+tkinter實(shí)現(xiàn)音樂(lè)下載軟件的制作
平常我們下載的歌曲,都是各種妖魔鬼怪的格式橫行,想下載下來(lái)用一下都不行,還只能在它的播放器內(nèi)聽(tīng),這誰(shuí)受得了~本文就來(lái)用Python制作個(gè)音樂(lè)下載軟件,需要的可以參考一下2022-09-09
對(duì)Keras自帶Loss Function的深入研究
這篇文章主要介紹了對(duì)Keras自帶Loss Function的深入研究,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
python中偏函數(shù)partial用法實(shí)例分析
這篇文章主要介紹了python中偏函數(shù)partial用法,實(shí)例分析了偏函數(shù)partial的功能、定義及使用方法,需要的朋友可以參考下2015-07-07

