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中Django 后台自定义表单控件
Mar 28 Python
python merge、concat合并数据集的实例讲解
Apr 12 Python
python自动化报告的输出用例详解
May 30 Python
实例讲解Python爬取网页数据
Jul 08 Python
python执行CMD指令,并获取返回的方法
Dec 19 Python
详解js文件通过python访问数据库方法
Mar 03 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
python中append实例用法总结
Jul 30 Python
python plotly画柱状图代码实例
Dec 13 Python
如何验证python安装成功
Jul 06 Python
手把手教你将Flask应用封装成Docker服务的实现
Aug 19 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
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
2016/04/17 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Python中的数学运算操作符使用进阶
2016/06/20 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
python读取Excel实例详解
2018/08/17 Python
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
公务员转正鉴定材料
2014/02/11 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
鸡毛信观后感
2015/06/11 职场文书
react国际化react-intl的使用
2021/05/06 Javascript
Django显示可视化图表的实践
2021/05/10 Python
Nginx实现会话保持的两种方式
2022/03/18 Servers
Java基础——Map集合
2022/04/01 Java/Android