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)
# 创建蓝图
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)
