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怎么学好python?
Oct 07 Python
python socket网络编程步骤详解(socket套接字使用)
Dec 06 Python
Python合并字符串的3种方法
May 21 Python
Python实现基本线性数据结构
Aug 22 Python
python制作企业邮箱的爆破脚本
Oct 05 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
基于python 爬虫爬到含空格的url的处理方法
May 11 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
Python之循环结构
Jan 15 Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 Python
Python时间差中seconds和total_seconds的区别详解
Dec 26 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编写和读取XML的几种方式
2013/01/12 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
用Laravel轻松处理千万级数据的方法实现
2020/12/25 PHP
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
未婚证明书模板
2014/10/08 职场文书
乔迁新居祝福语
2019/11/04 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python