本文实例讲述了Sanic框架异常处理与中间件操作。分享给大家供大家参考,具体如下:
简介
Sanic是一个类似Flask的Python 3.5+ Web服务器,它的写入速度非常快。除了Flask之外,Sanic还支持异步请求处理程序。这意味着你可以使用Python 3.5中新的闪亮的异步/等待语法,使你的代码非阻塞和快速。
前言:Sanic最低支持Python 3.5,如果需要学习Sanic,请先下载版本不低于3.5的Python包
异常
异常可以从请求处理程序中抛出,并由Sanic自动处理。异常将消息作为第一个参数,并且还可以将状态码传回HTTP响应中。
抛出异常:手动产生异常的方式,有过Python基础的都知道,可以使用raise
来产生一个异常:
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
装饰器,然后在定义一个异常函数来进行处理。异常装饰器处理函数必须以一个Request
和Exception
对象作为参数:
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))
中间件
中间件是服务器在请求之前或之后执行的功能,他们可以用来修改修改用户定义处理函数的请求或相应。Sanic提供两种类型的中间件:请求和响应。两者都是使用@app.middleware
装饰器声明,两个装饰器分别需要传入一个代表其类型的参数: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("响应中间件")
当我们访问/get_info
请求时,打印结果将会是这样的:
请求中间件
http://localhost:5000/get_info
响应中间件
值得注意的是,如果是响应中间的处理函数,除了需要传递一个request
对象参数,还需要传递一个response
对象参数。从结果可以看出,request
中间件是在接收到请求时立马触发的,而response
中间件是在接收到响应时立马触发的。针对这两者的特性,我们可以进行一些特殊的操作,来达到我们的目的:
@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
,并且在响应头中添加name=laozhang
监听器
如果需要在服务器启动/关闭的时候,执行一些特殊的代码,则可以使用以下监听器:
- before_server_start:在服务器启动之前执行
- after_server_start:在服务器启动之后执行
- before_server_stop:在服务器关闭之前执行
- after_server_stop:在服务器关闭之后执行
举个栗子:
@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")
现在先启动服务,而后关闭,发现执行的顺序将会是这样:
before_server_start
after_server_start
before_server_stop
after_server_stop
更多关于Python相关内容可查看本站专题:《Python入门与进阶经典教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
Sanic框架,异常处理,中间件
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]