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中的文件
- 所以,尽量不要将模板文件设置同名