Flask框架中蓝图的使用
1.基本使用
- 蓝图的作用: 实现Flask项目 模块化
- 项目模块化主要是 将业务以功能模块进行划分, 每个功能模块对应一个包, 用于存放和其有关的视图/工具/模型文件等, 如home, user
- 对于大型项目, 一般 每个功能模块对应创建一个蓝图, 由多个蓝图代替应用来分别管理各模块的视图
--------- project # 工程目录
|------ main.py # 启动文件
|------ user # 用户模块
| |--- __init__.py # 包的初始化文件, 此处创建管理用户模块的蓝图对象
| |--- views.py # 视图文件
| |--- ...
|
|------ home # 首页模块
| |--- __init__.py # 包的初始化文件, 此处创建管理首页模块的蓝图对象
| |--- views.py # 视图文件
| |--- ...
|...
代码示例:
- 在 home包 的初始化文件 init.py 中, 创建蓝图对象
# home/__init__.py
from flask import Blueprint
# 1. 创建蓝图对象
home_blu = Blueprint("home_b", __name__)
- 在 home包中创建 views文件, 存放视图函数
- 定义视图函数时, 使用蓝图对象来定义路由
# home/views.py
from home import home_blu
# 2. 使用蓝图对象来定义路由
@home_blu.route('/')
def index():
return "index"
想要让蓝图对象能够完成路由定义, 还需要 Flask应用注册蓝图对象
# main.py
from flask import Flask
from home import home_blu
app = Flask(__name__)
# 3.应用注册蓝图对象
app.register_blueprint(home_blu)
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
视图文件目前是独立的, 还需要 包的初始化文件导入视图文件, 让视图文件和主程序建立关联
# home/__init__.py
from flask import Blueprint
# 1. 创建蓝图对象
home_blu = Blueprint("home_b", __name__)
# 4. 让视图文件和主程序建立关联
# 遇到ImportError, 需要查看和调整代码的执行顺序
from . import views
2.使用细节
蓝图的三个使用细节
- 创建蓝图时, 可以通过 url_prefix参数 给蓝图定义的路由添加 统一的URL资源段前缀
- 蓝图定义的路由, 其函数标记为 蓝图名.函数名
- 蓝图也可以 设置请求钩子
- 只有访问该蓝图定义的路由时才会触发
- 实现局部监听
示例代码
# home/__init__.py
from flask import Blueprint
# 细节1: 可以通过url_prefix参数给蓝图定义的路由添加统一的URL资源段前缀
home_blu = Blueprint("home_b", __name__, url_prefix='/home')
# 细节3: 蓝图也可以设置请求钩子 只有访问该蓝图定义的路由时才会触发 局部监听
@home_blu.before_request
def home_prepare():
print('home_prepare')
from . import views
# home/views.py
from flask import url_for
from home import home_blu
@home_blu.route('/')
def index():
return "index"
@home_blu.route('/demo1')
def demo1():
# 细节2: 蓝图定义的路由, 其函数标记为 蓝图名.函数名
url1 = url_for('home_b.demo1')
# print(url1)
return 'demo1'