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中的列表推导浅析
Apr 26 Python
Python中生成器和yield语句的用法详解
Apr 17 Python
Python基于列表list实现的CRUD操作功能示例
Jan 05 Python
Python实现自动上京东抢手机
Feb 06 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
python实现Flappy Bird源码
Dec 24 Python
Python设计模式之建造者模式实例详解
Jan 17 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
python 哈希表实现简单python字典代码实例
Sep 27 Python
python实现梯度下降算法的实例详解
Aug 17 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 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
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
详解vue的diff算法原理
2018/05/20 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
Python深入学习之上下文管理器
2014/08/31 Python
Python判断Abundant Number的方法
2015/06/15 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
酒店采购员岗位职责
2014/03/14 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
质量保证书
2015/01/17 职场文书
换届选举主持词
2015/07/03 职场文书