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实现带验证码网站的自动登陆实现代码
Jan 12 Python
详解Python函数作用域的LEGB顺序
May 14 Python
深入理解python对json的操作总结
Jan 05 Python
numpy自动生成数组详解
Dec 15 Python
聊聊Python中的pypy
Jan 12 Python
如何利用python查找电脑文件
Apr 27 Python
python读取和保存图片5种方法对比
Sep 12 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
详解用python写一个抽奖程序
May 10 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
Django 用户登陆访问限制实例 @login_required
May 13 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如何透过ODBC来存取数据库
2006/10/09 PHP
利用PHP实现短域名互转
2013/07/05 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
艺术设计专业个人求职信
2013/09/21 职场文书
小学生倡议书范文
2014/05/13 职场文书
个人作风建设总结
2014/10/23 职场文书
办公室个人总结
2015/02/28 职场文书
合作与交流自我评价
2015/03/09 职场文书
紧急通知
2015/04/17 职场文书
新员工入职感想
2015/08/07 职场文书