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 相关文章推荐
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
Python中的单继承与多继承实例分析
May 10 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
May 31 Python
python实现键盘控制鼠标移动
Nov 27 Python
如何使用Python进行OCR识别图片中的文字
Apr 01 Python
如何使用Flask-Migrate拓展数据库表结构
Jul 24 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
Python中可变和不可变对象的深入讲解
Aug 02 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 Python
Python数组变形的几种实现方法
May 30 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
一个MYSQL操作类
2006/11/16 PHP
php set_magic_quotes_runtime() 函数过时解决方法
2010/07/08 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
2017/06/07 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
window.open打开页面居中显示的示例代码
2013/12/27 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
2019/06/06 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
vscode 远程调试python的方法
2017/12/01 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
python time()的实例用法
2020/11/03 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
电气自动化大学生求职信
2013/10/16 职场文书
通用求职信范文模板分享
2013/12/27 职场文书
护士辞职信模板
2014/01/20 职场文书
土木工程专业推荐信
2014/02/19 职场文书
党员检讨书
2014/10/13 职场文书
财务会计实训报告
2014/11/05 职场文书
《刷子李》教学反思
2016/02/20 职场文书
React配置子路由的实现
2021/06/03 Javascript