Sanic框架异常处理与中间件操作实例分析
作者:喷跑的豆子 发布时间:2023-04-30 00:27:31
本文实例讲述了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程序设计有所帮助。
来源:https://blog.csdn.net/y472360651/article/details/80174178
猜你喜欢
- 前言本博客重点:folium的使用功能,图层控制、指北针、folium添加js和css、经纬网格线(栅格线)在上一篇使用folium制作地图
- 说明1、方差检验是用来比较两个或多个变量数据的样本,以确定它们之间的差异是简单随机的,或者是由于过程之间的显著统计差异造成的。2、自变量X是
- 在上篇博客中,我们已经实现了水平投影和垂直投影图的绘制。接下来,我们可以根据获得的投影数据进行图像的分割,该法用于文本分割较多,所以此处依然
- 前言with 这个关键字,对于每一学习Python的人,都不会陌生。操作文本对象的时候,几乎所有的人都会让我们要用 with open ,这
- 如下所示:#tensorflow 中从ckpt文件中恢复指定的层或将指定的层不进行恢复:#tensorflow 中不同的layer指定不同的
- 1 查找记录条数 select count(*) from table_name(换成表名)&nbs
- Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,
- 如下所示:# -*- coding:utf-8 -*-from datetime import datetimeimport redef M
- 前言图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起
- 目录GIL 的起源尝试消除 GIL积重难返为什么 Python3 一开始时不去除 GIL最后的话我们知道,在 CPython 中,有一个全局
- “表情包”是当前社交软件上不可或缺的交流方式,难以用文字表达的意思,发一个“表情包”,对方就能心领神会。下面是小派制作的一个表情包,准确地讲
- asyncore即是一个异步的socket封装,特别是dispatcher类中包含了很多异步调用的socket操作方法。模块常见方法这个模块
- 本文实例为大家分享了Python编写车票订购系统,Python实现快递收费系统的具体代码,供大家参考,具体内容如下要求:1.上网查询郑州到北
- Q:Dreamweaver(简称DW)中如何输入空格?A:按下“Ctrl+Shift+空格键”或者在中
- 修改文件的名字 使用“FileSystemObject(文件系统对象)”的GetFile函数得到一个“文件对象”,然后修改这个“文件对象”的
- 一,红绿灯揭示板案例思路1. 创建Traffic_light红绿灯类(1)静态属性 :<1> 绿灯时间,<2> 黄灯
- python3 cmp实现python3移除了cmp()函数,但提供了六个丰富的比较运算符,详见此处import operator &nbs
- 项目介绍我们先来看看成果:首先写了一个能够操作的GUI界面。其中两个按钮对应相应的功能:采集人脸:识别功能:我可是牺牲了色相五五五五。。。(
- 基于requests模块发起ajax的get请求需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情
- 使用了application及结合数据库来保存统计数据 <html><head><title>