Sanic框架異常處理與中間件操作實例分析
本文實例講述了Sanic框架異常處理與中間件操作。分享給大家供大家參考,具體如下:
簡介
Sanic是一個類似Flask的Python 3.5+ Web服務(wù)器,它的寫入速度非??臁3薋lask之外,Sanic還支持異步請求處理程序。這意味著你可以使用Python 3.5中新的閃亮的異步/等待語法,使你的代碼非阻塞和快速。
前言:Sanic最低支持Python 3.5,如果需要學(xué)習(xí)Sanic,請先下載版本不低于3.5的Python包
異常
異??梢詮恼埱筇幚沓绦蛑袙伋觯⒂蒘anic自動處理。異常將消息作為第一個參數(shù),并且還可以將狀態(tài)碼傳回HTTP響應(yīng)中。
拋出異常:手動產(chǎn)生異常的方式,有過Python基礎(chǔ)的都知道,可以使用raise
來產(chǎn)生一個異常:
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")
處理異常:有時我們需要對一些特殊異常做特殊處理,此時我們可以用到@app.exception
裝飾器,然后在定義一個異常函數(shù)來進(jìn)行處理。異常裝飾器處理函數(shù)必須以一個Request
和Exception
對象作為參數(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ù)器在請求之前或之后執(zhí)行的功能,他們可以用來修改修改用戶定義處理函數(shù)的請求或相應(yīng)。Sanic提供兩種類型的中間件:請求和響應(yīng)。兩者都是使用@app.middleware
裝飾器聲明,兩個裝飾器分別需要傳入一個代表其類型的參數(shù):request
和response
,下面舉一個簡單的栗子:
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("請求中間件") @app.middleware("response") async def get_response_middleware(request,response): print("響應(yīng)中間件")
當(dāng)我們訪問/get_info
請求時,打印結(jié)果將會是這樣的:
請求中間件
http://localhost:5000/get_info
響應(yīng)中間件
值得注意的是,如果是響應(yīng)中間的處理函數(shù),除了需要傳遞一個request
對象參數(shù),還需要傳遞一個response
對象參數(shù)。從結(jié)果可以看出,request
中間件是在接收到請求時立馬觸發(fā)的,而response
中間件是在接收到響應(yīng)時立馬觸發(fā)的。針對這兩者的特性,我們可以進(jìn)行一些特殊的操作,來達(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"
將所有的請求的args添加一條name=laozhang
,并且在響應(yīng)頭中添加name=laozhang
監(jiān)聽器
如果需要在服務(wù)器啟動/關(guān)閉的時候,執(zhí)行一些特殊的代碼,則可以使用以下監(jiān)聽器:
- before_server_start:在服務(wù)器啟動之前執(zhí)行
- after_server_start:在服務(wù)器啟動之后執(zhí)行
- before_server_stop:在服務(wù)器關(guān)閉之前執(zhí)行
- after_server_stop:在服務(wù)器關(guān)閉之后執(zhí)行
舉個栗子:
@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)在先啟動服務(wù),而后關(guān)閉,發(fā)現(xiàn)執(zhí)行的順序?qū)沁@樣:
before_server_start
after_server_start
before_server_stop
after_server_stop
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python入門與進(jìn)階經(jīng)典教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
Python基礎(chǔ)學(xué)習(xí)列表+元組+字典+集合
這篇文章主要介紹了Python基礎(chǔ)學(xué)習(xí)列表+元組+字典+集合,文章接上一篇內(nèi)容學(xué)習(xí),主要針對python零基礎(chǔ)的同學(xué),感興趣的話就學(xué)起來吧2022-05-05python通過ElementTree操作XML獲取結(jié)點讀取屬性美化XML
本文講解如何通過ElementTree解析XML,獲取兒子結(jié)點、插入兒子結(jié)點、操作屬性、美化XML2013-12-12python圖像處理基本操作總結(jié)(PIL庫、Matplotlib及Numpy)
這篇文章主要給大家介紹了關(guān)于python圖像處理基本操作的相關(guān)資料,主要利用的是PIL庫、Matplotlib及Numpy等處理方法,需要的朋友可以參考下2021-06-06詳解Python中最常用的10個內(nèi)置函數(shù)
Python作為一種多用途編程語言,擁有豐富的內(nèi)置函數(shù)庫,這些函數(shù)可以極大地提高開發(fā)效率,本文將介紹Python中最常用的10個內(nèi)置函數(shù),我們將深入了解每個函數(shù),并提供示例代碼以幫助您更好地理解它們,需要的朋友可以參考下2023-11-11