跳转至
  • 蓝图类似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

38890-c8v2db1tq3u.png