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创建和使用字典实例详解
Nov 01 Python
解密Python中的描述符(descriptor)
Jun 03 Python
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
python实现求最长回文子串长度
Jan 22 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
Django中URL的参数传递的实现
Aug 04 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
python基础学习之生成器与文件系统知识总结
May 25 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 Python
python全面解析接口返回数据
Feb 12 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
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
Python深入学习之特殊方法与多范式
2014/08/31 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
Django框架验证码用法实例分析
2019/05/10 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
python机器学习库xgboost的使用
2020/01/20 Python
Python tkinter和exe打包的方法
2020/02/05 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
个人借款协议书范本
2014/11/17 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
离婚起诉书范本
2015/05/18 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书