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 相关文章推荐
python导出hive数据表的schema实例代码
Jan 22 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
Sanic框架配置操作分析
Jul 17 Python
python 从文件夹抽取图片另存的方法
Dec 04 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
Python unittest生成测试报告过程解析
Sep 08 Python
Python实现聚类K-means算法详解
Jul 15 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
谏山创故乡大分县日田市水坝将设立《进击的巨人》立艾伦、三笠以及阿尔敏的铜像!
2020/03/06 日漫
php中将网址转换为超链接的函数
2011/09/02 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
豆瓣网的jquery代码实例
2008/06/15 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
js选项卡的实现方法
2015/02/09 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
tornado 多进程模式解析
2018/01/15 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
python openpyxl模块的使用详解
2021/02/25 Python
CSS3实现多重边框的方法总结
2016/05/31 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
运动会四百米广播稿
2014/01/19 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
《忆江南》教学反思
2014/04/07 职场文书
养成教育经验材料
2014/05/26 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL