Sanic框架蓝图用法实例分析


Posted in Python onJuly 17, 2018

本文实例讲述了Sanic框架蓝图用法。分享给大家供大家参考,具体如下:

蓝图是可以用于应用程序内子路由的对象。蓝图并未向应用程序内添加路由,而是定义了用于添加路由的类似方法,然后以灵活且可插入的方式向应用程序注册路由。

蓝图对于大型应用程序尤其有用,您的应用程序可以分解成为几个小组或责任区域。

第一个蓝图

假设你在bp/bp_1.py文件下,定义了以下这么一个非常简单的蓝图:

from sanic import Blueprint
from sanic.response import text
bp = Blueprint("first_bp")
@bp.route("/get_info")
async def get_info(request):
  return text("it is ok!")

注册蓝图

定义了一个蓝图之后,必须在应用程序中注册:

from sanic import Sanic
from bp.bp_1 import bp
app = Sanic()
app.blueprint(bp)
if __name__ == "__main__":
  app.run()

如此,并将蓝图添加到应用程序当中,并注册蓝图所定义的所有路由。此时我们就可以访问/get_info就可以获取到数据了

蓝图的使用

在前面一篇《Sanic框架异常处理与中间件操作》中简单介绍了一下在路由中如何使用中间件与异常以及监听器等,这些东西在蓝图中同样可以使用:

中间件:使用蓝图可以在全局范围内注册中间件

@bp.route("/get_info")
async def get_info(request):
  return text("get_info")
@bp.middleware("request")
async def handle_md_request(request):
  print("request middleware")
@bp.middleware("response")
async def handle_md_response(request,response):
  print("response middleware")

异常:使用蓝图可以在全局范围内注册异常

from sanic.exceptions import NotFound
@bp.exception(NotFound)
async def handle_exception(request,exception):
  return text("404 exception")

静态文件:静态文件可以在蓝图前缀下全局提供

bp.static("/home","/aaa/bbb/abc.html")

监听器:如果需要在服务器启动/关闭的时候,执行一些特殊的代码,则可以使用以下监听器,可用的监听器如下:

  • before_server_start:在服务器开始接收连接之前执行
  • after_server_start:在服务器开始接收连接之后执行
  • before_server_stop:在服务器停止接收连接之前执行
  • after_server_stop:在服务器停止接收连接之后执行
@bp.listener("before_server_start")
async def before_server_start(request,loop):
  print("before server start")
@bp.listener("after_server_start")
async def after_server_start(request,loop):
  print("after server start")
@bp.listener("before_server_stop")
async def before_server_stop(request,loop):
  print("before server stop")
@bp.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

API版本控制

与手机APP对接的接口开发中,API版本控制尤为重要,针对于低版本用户(尚未升级版本的用户)所用的仍是旧的接口数据,此时开发新功能时对此模块的数据需要进行修改,可是不能影响旧版本的用户,此时我们就需要对API版本进行控制。我们可以定义两个蓝图,一个指向/v1/<route>,另一个指向/v2/<route>。当蓝图初始化时,我们可以采用一个可选参数url_prefix,该参数将被置于蓝图定义的所有路由之上,这个特性可以来实现我们的API版本控制方案:

from sanic import Blueprint
from sanic.response import text
bp1 = Blueprint("bp1",url_prefix="/v1")
bp2 = Blueprint("bp2",url_prefix="/v2")
@bp1.route("/get_data")
async def get_v1_data(request):
  return text("it is v1")
@bp2.route("/get_data")
async def get_v2_data(request):
  return text("it is v2")

此时,我们已经定义好了两个蓝图来控制两个版本,我们需要在app中注册它们:

from sanic import Sanic
from app.bp.bp_info import bp1,bp2
app = Sanic()
app.blueprint(bp1)
app.blueprint(bp2)
if __name__ == "__main__":
  app.run()

重定向

在之前的博文中,我们讲到可以使用url_for基于处理程序方法名称生成URL,然后使用redirect进行重定向,在蓝图中同样使用:

from sanic.response import text,redirect
@bp.route("/")
async def handle_root(request):
  # bp为定义蓝图实例中的name
  url = request.app.url_for("bp.get_info",name="laozhang")
  return redirect(url)
@bp.route("/get_info/<name>")
async def get_info(request,name):
  return text("name:{}".format(name))

更多关于Python相关内容可查看本站专题:《Python入门与进阶经典教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
用C++封装MySQL的API的教程
May 06 Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
详解Python中的__getitem__方法与slice对象的切片操作
Jun 27 Python
Python批处理更改文件名os.rename的方法
Oct 26 Python
python使用suds调用webservice接口的方法
Jan 03 Python
10个Python面试常问的问题(小结)
Nov 20 Python
python读取ini配置的类封装代码实例
Jan 08 Python
Python+OpenCV实现将图像转换为二进制格式
Jan 09 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
用pip给python安装matplotlib库的详细教程
Feb 24 Python
PyCharm设置SSH远程调试的方法
Jul 17 #Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 #Python
pycharm远程linux开发和调试代码的方法
Jul 17 #Python
Flask框架各种常见装饰器示例
Jul 17 #Python
详解基于django实现的webssh简单例子
Jul 17 #Python
Python爬虫之网页图片抓取的方法
Jul 16 #Python
python编辑用户登入界面的实现代码
Jul 16 #Python
You might like
使用 php4 加速 web 传输
2006/10/09 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
php fread读取文件注意事项
2016/09/24 PHP
php生出随机字符串
2017/07/06 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
js获取变量
2006/08/24 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
Jquery的Ajax技术使用方法
2019/01/21 jQuery
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
Python中使用item()方法遍历字典的例子
2014/08/26 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
numpy.random模块用法总结
2019/05/27 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
PHP面试题-$message和$$message的区别
2015/12/08 面试题
自荐信格式的六要素
2013/09/21 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
2014年平安夜寄语
2014/12/08 职场文书
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js