现在位置: 首页 > Flask 教程 > 正文

Flask Blueprint 蓝图对象 API

Blueprint 用于将应用拆分为可复用的模块,每个蓝图可以有自己的路由、模板、静态文件和钩子。

创建方式:

bp = Blueprint("auth", __name__)

构造函数参数

参数 类型 默认值 说明
name str 必填 蓝图名称,用于 url_for 中的 endpoint 前缀
import_name str 必填 蓝图所在模块名,用于定位资源。通常传递 __name__
static_folder str None 蓝图的静态文件文件夹
static_url_path str None 静态文件对外暴露的 URL 路径
template_folder str None 蓝图的模板文件夹
url_prefix str None 蓝图所有路由的统一前缀,如 "/auth"
subdomain str None 蓝图路由匹配的子域名
url_defaults dict None 蓝图路由的默认 URL 参数
root_path str None 蓝图根路径,通常自动发现
cli_group str None CLI 命令组名。默认使用蓝图名称

核心属性

属性 类型 说明
name str 蓝图名称,注册后用于 endpoint 前缀
cli AppGroup 蓝图专属的 CLI 命令组,可添加自定义命令
has_static_folder bool 是否配置了静态文件夹

路由方法

蓝图的用法与 Flask 应用一致,只是把 app 换为 bp

方法 说明
route(rule, **options) 装饰器,绑定 URL 到视图函数
get / post / put / delete / patch(rule, **options) HTTP 方法快捷装饰器
add_url_rule(rule, endpoint, view_func, **options) 编程方式添加 URL 规则

钩子装饰器

蓝图的钩子只影响该蓝图内的路由:

方法 说明
before_request 蓝图内所有请求前执行
after_request 蓝图内请求响应后执行
teardown_request 蓝图内请求上下文销毁时执行
errorhandler(code_or_exception) 蓝图内错误处理器
url_value_preprocessor 蓝图内 URL 值预处理器
url_defaults 蓝图内 URL 默认参数
template_filter / template_test / template_global 蓝图模板过滤器/测试/全局函数

蓝图特有方法

方法 说明
register(app, options) 将蓝图注册到 Flask 应用。由 app.register_blueprint() 内部调用
record(func) 注册一个回调函数,在蓝图注册到应用时调用
record_once(func) 同 record,但多次注册蓝图时只执行一次
make_setup_state(app, options) 创建蓝图注册状态对象
send_static_file(filename) 从蓝图静态文件夹发送文件
open_resource(resource, mode="rb") 打开蓝图根路径下的资源文件

注册蓝图时的 options 参数

调用 app.register_blueprint(bp, **options) 时可传递:

参数 说明
url_prefix 覆盖蓝图的 URL 前缀
subdomain 覆盖蓝图的子域名
url_defaults 覆盖蓝图的 URL 默认值
name 重命名蓝图(同一蓝图可注册多次,每次用不同名称)

代码示例

实例

from flask import Blueprint, render_template

# 创建蓝图
bp = Blueprint("blog", __name__,
               url_prefix="/blog",
               template_folder="templates",
               static_folder="static")

# 注册路由
@bp.route("/")
def index():
    return render_template("blog/index.html")

@bp.route("/<int:post_id>")
def show(post_id):
    return f"Show post {post_id}"

# 蓝图内钩子
@bp.before_request
def check_login():
    # 只对 /blog/* 路径生效
    pass

# 在 app 中注册
# app.register_blueprint(bp)