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装饰器,然后在定义一个异常函数来进行处理。异常装饰器处理函数必须以一个RequestException对象作为参数:


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装饰器声明,两个装饰器分别需要传入一个代表其类型的参数:requestresponse,下面举一个简单的栗子:


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

标签:Sanic框架,异常处理,中间件
0
投稿

猜你喜欢

  • 详解python文件的操作和异常的处理

    2021-06-07 04:05:37
  • 关于Flask 上下文详细介绍

    2023-12-10 01:52:32
  • Python中处理时间的几种方法小结

    2021-03-15 17:58:33
  • JS实现炫酷雪花飘落效果

    2024-04-16 10:36:54
  • 修改 CentOS 6.x 上默认Python的方法

    2023-08-07 10:02:59
  • KB967723补丁造成的MYSQL在Win2003上频繁连接不上的问题的解决方法

    2024-01-18 11:20:39
  • 详解Django admin高级用法

    2021-08-08 23:55:38
  • Python集合之set和frozenset的使用详解

    2021-06-26 22:41:20
  • 深入解析pandas数据聚合和重组

    2023-11-17 17:45:51
  • Django表单提交后实现获取相同name的不同value值

    2023-08-11 01:59:31
  • 解决vue项目 build之后资源文件找不到的问题

    2024-04-27 16:07:42
  • Golang收支记账程序详细编写过程

    2024-04-25 15:17:38
  • Web2.0视觉风格进化论 之一

    2007-11-03 19:58:00
  • Access 2007简易入门手册

    2008-12-04 13:12:00
  • 关于reflow

    2007-09-23 13:30:00
  • Python web框架(django,flask)实现mysql数据库读写分离的示例

    2024-01-14 15:46:36
  • Python模块_PyLibTiff读取tif文件的实例

    2023-04-11 03:22:06
  • laravel中短信发送验证码的实现方法

    2023-11-15 08:05:16
  • 动易CMS:九个常见的错误原因分析及解决方法(ZT)

    2008-07-01 12:40:00
  • 用python实现一幅春联实例代码

    2021-07-23 09:25:41
  • asp之家 网络编程 m.aspxhome.com