- 蓝图类似Django中的app用于模块化设计
- 蓝图也可以设置请求钩子,但是只限于本蓝图
- 蓝图中如果重定向,
url_for
是获取不到正确的路径的需要用蓝图的别名
.视图函数的名称
来获得真正的url
1. 在模块的init文件中创建蓝图对象
- 注意设置别名, 重定向会用到
url_prefix
给蓝图中的路由统一加上前缀,这样访问时需要在具体的视图路径前加上设置的蓝图前缀
# 1. 创建蓝图对象
user_blue = Blueprint('user_b', # 设置别名
__name__,
url_prefix='/user' # 使用 url_prefix 给蓝图的请求路径设置统一的前缀,这样我们视图中的路由自动加上 /user
)
# 给整个蓝图设置请求钩子,只限于这个蓝图
@user_blue.before_request
def user_blue_before():
print('这是蓝图中的钩子 before_request 函数打印的')
2. 在模块中views文件中使用蓝图对象注册视图
from flask import url_for, redirect
from blue_print import user_blue
# 2. 使用蓝图对象来注册路由
@user_blue.route('/')
def user_info():
return '这里是个人中心1'
@user_blue.route('/address')
def address():
url = url_for('user_b.user_info') # 注意!!!: 如果路由是蓝图注册的, 其函数标记名称则是: 蓝图名.函数名
print(url)
return redirect(url)
3. 在主控应用使用Flask对象中注册蓝图
from flask import Flask
from blue_print import user_blue
app = Flask(__name__)
# 3. 使用应用注册蓝图对象
app.register_blueprint(user_blue)
if __name__ == '__main__':
print(app.url_map)
app.run(host='0.0.0.0', port='8000')
4. 使蓝图和视图建立连接
- 在蓝图中的init文件中导入视图文件, len16
- 注意导入需要放到最下面, 不然会有依赖问题
from flask import Blueprint
# 1. 创建蓝图对象
user_blue = Blueprint('user_b',
__name__,
url_prefix='/user' # 使用 url_prefix 给蓝图的请求路径设置统一的前缀,这样我们试图中的路由自动加上 /user
)
# 给整个蓝图设置请求钩子,只限于这个蓝图
@user_blue.before_request
def user_blue_before():
print('这是蓝图中的钩子 before_request 函数打印的')
# 4. 使views与蓝图有关联, 这个导入需要放在创建蓝图对象的下面,因为views里面的代码是依赖于user_blue创建好之后
from . import views