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


猜你喜欢
- 1、确定服务器上的防火墙没有阻止 3306 端口 MySQL 默认的端口是 3306 ,需要确定防火墙没有阻止 3306 端口,否则远程是无
- 本文实例为大家分享了Python版名片管理系统的具体代码,供大家参考,具体内容如下先建立cards_main的文件import cards_
- 背景有一个项目,今年12月份开始重构,项目涉及到了socket。但是socket用的是以前一个开发人员封装的包(这个一直被当前的成员吐槽为什
- 数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第三部分 概述:程序访问优化也可以认为是访问SQL语
- 本文测试环境:CentOS 7 64-bit Minimal MySQL 5.7配置 yum 源在 https://dev.mysql.co
- #/usr/bin/env python#-*- coding:utf-8 -*-"""1.解析 cronta
- 二维码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形。二维码被称为快速响应码,可能看起来很简
- 以下列出了两种数据库的方法:ASP+Access20001.要获取的ID值字段属性必须设为:自动编号(我们假设字段名为recordID)2.
- 测试驱动开发(TDD)是一个迭代的开发周期,强调编写实际代码之前编写自动化测试。这个过程很简单: 先编写
- lstm(*input, **kwargs)将多层长短时记忆(LSTM)神经网络应用于输入序列。参数:input_size:输入'x
- 模版结构优化引入模版有时候一些代码是在许多模版中都用到的。如果我们每次都重复的去拷贝代码那肯定不符合项目的规范。一般我们可以把这些重复性的代
- 1、HTML部分<Col span="2">上传文件:</Col><Col span=&q
- python的时间模块生成时间戳的方法是非常简单的,因为最近频繁用到了时间戳功能,这里简单总结了一下日常使用最为频繁的两个时间模块各自生成当
- UUID(Universally Unique Identifier)是通用唯一识别码,在许多领域用作标识,比如我们常用的数据库也可以用它来
- 在通过Javascript实现客户端和服务端的交互时,有时候需要对操作系统进行判断,以便实现不同操作系统下的兼容性,比如:我们有一个网站,
- 实验室老师让给数据画一张线性拟合图。不会matlab,就琢磨着用python。参照了网上的一些文章,查看了帮助文档,成功的写了出来这里用到了
- 原文: gradio.app/interface-s…1.全局状态例子来解释import gradio as grsc
- 简介最近在整理我们项目代码的时候,发现有很多活动的代码在结构和提供的功能上都非常相似。为了方便今后的开发,我花了一点时间编写了一个生成代码框
- 如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能。如下图: 第一层
- 在Python中使用字典,格式如下:dict={ key1:value1 , key2;value2 ...}在实际访问字典值时的使用格式如