Sanic框架异常处理与中间件操作实例分析


Posted in Python onJuly 16, 2018

本文实例讲述了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相关内容可查看本站专题:《Python入门与进阶经典教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中apply函数的用法实例教程
Jul 31 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
Apr 25 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
python实现微信小程序自动回复
Sep 10 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
简单了解python单例模式的几种写法
Jul 01 Python
python挖矿算力测试程序详解
Jul 03 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
Python 实现PS滤镜的旋涡特效
Dec 03 Python
python 解决微分方程的操作(数值解法)
May 26 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 #Python
对Python3.6 IDLE常用快捷键介绍
Jul 16 #Python
Sanic框架请求与响应实例分析
Jul 16 #Python
解决Python 中英文混输格式对齐的问题
Jul 16 #Python
Django实战之用户认证(用户登录与注销)
Jul 16 #Python
Python3数据库操作包pymysql的操作方法
Jul 16 #Python
django缓存配置的几种方法详解
Jul 16 #Python
You might like
当海贼王变成JOJO风
2020/03/02 日漫
模仿OSO的论坛(三)
2006/10/09 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
如何用PHP实现插入排序?
2013/04/10 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
通过dbi使用perl连接mysql数据库的方法
2014/04/16 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
Angular之toDoList的实现代码示例
2017/12/02 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
Python中subprocess的简单使用示例
2015/07/28 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
总经理文秘岗位职责
2014/02/03 职场文书
银行委托书范本
2014/09/28 职场文书
检讨书范文2000字
2015/01/28 职场文书
一年级语文教学随笔
2015/08/14 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
各种货币符号快捷输入
2022/02/17 杂记
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫