Blueprint蓝图

Blueprint的介绍
  • 使用Blueprint的目的
    • 为了将代码模块化,随着flask程序越来越复杂,我们需要对程序进行模块化的处理,之前学习过python的模块化管理,于是针对一个简单的flask程序进行模块化处理
  • Blueprint的概念
    • 简单来说,Blueprint 是一个存储操作方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求。
    • Flask使用Blueprint让应用实现模块化。
  • Blueprint的属性
    • 一个应用可以具有多个Blueprint
    • 可以将一个Blueprint注册到任何一个未使用的URL下比如 “/”、“/sample”或者子域名
    • 在一个应用中,一个模块可以注册多次
    • Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
    • 在一个应用初始化时,就应该要注册需要使用的Blueprint
    • 一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中,相当于django中的app,而flask的应用实例相当于django的project
蓝图的运行机制
  • 蓝图机制的介绍
    • 蓝图是保存了一组将来可以在应用对象上执行的操作,注册路由就是一种操作
    • 当在应用对象上调用 route 装饰器注册路由时,这个操作将修改对象的url_map路由表
    • 然而,蓝图对象根本没有路由表,当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项
    • 当执行应用对象的 register_blueprint() 方法时,应用对象将从蓝图对象的 defered_functions 列表中取出每一项,并以自身作为参数执行该匿名函数,即调用应用对象的 add_url_rule() 方法,这将真正的修改应用对象的路由表
Blueprint的基本使用方法
  • 创建蓝图对象(不在main模块中)
    • from flask import Blueprint
    • user_api = Blue('user_api', __name__, static_folder, static_url_path, template_folder, url_prefix))
      • 第一个参数是创建的蓝图实例的名字,通过它来注册视图函数等
      • 第二个参数为蓝图所在模块名称,指定查找静态文件和模板文件的路径
      • static_folder: 静态文件路径,默认为None
      • static_url_path='py3': 访问前缀,默认和静态文件路径相等
      • template_folder: 模板文件路径,默认为None
      • url_prefix: 访问前缀,也可以通过app在注册蓝图的时候设置
  • 在蓝图对象上进行操作,注册路由视图函数
    • @user_api.route('/user_info')
    • def user_info():
      • return 'user_info'
  • 在应用对象上注册这个蓝图对象(一个应用可以注册多个蓝图对象,实现模块化)
    • from ***  import user_api
    • app.register_blueprint(user_api, url_prefix='/user')
      • url_prefix:
        • 可以指定一个url_prefix关键字参数(这个参数默认是/)
        • 应用最终的路由表 url_map中,在蓝图上注册的路由URL自动被加上了这个前缀
将flask项目模块化
  • 目标效果:
    • 将项目的功能块进行查分,每一类功能创建一个目录,通过蓝图的功能将每一组功能分别创建在每一个目录下,每个目录自带static和templates(类似django项目),实现项目的模块化;
  • 实现步骤
    • 创建单个小应用的文件夹(以cart为例
    • 在__init__中初始化蓝图,并初始化视图函数
      • from flask  import Blueprint
      • cart_api  = Blueprint('cart_api', __name__, static_folder, static_url_path, template_folder, url_prefix)
      • from views import cart_list   因为初始化蓝图的时候没有走注册视图函数的代码,一定要手动导入
    • 在view中使用蓝图注册路由
      • from .  import cart_api
      • @cart_api.route('/cart_list'):
      • def cart_list():
        • return 'cart_list'
    • 在main中注册蓝图
      • from cart import cart_api
      • app.register_blueprint(cart_api, url_prefix='/cart')
  • 备注
    • 如果在根目录下的templates中存在和蓝图templates同名文件,则系统会优先使用根目录templates中的文件
    • 所以,尽量不要将模板文件设置同名

刘小恺(Kyle) wechat
如有疑问可联系博主