You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Flask 如何将变量传递到多个蓝图的所有路由中

问题分析

你之前在create_app中定义变量不生效,是因为普通局部变量无法被外部的蓝图模块访问,必须将公共变量放到Flask提供的全局可访问对象中才能实现跨蓝图共用,下面是两种成熟的实现方案:


方案1:上下文处理器 + g对象(路由、模板通用,推荐)

适合公共变量需要动态更新、同时要在路由和模板中使用的场景,一次定义全应用生效:

  1. 在create_app函数中注册全局请求钩子和上下文处理器:
from flask import g

def create_app():
    app = Flask(__name__)
    # 先初始化db等扩展
    db.init_app(app)

    # 全局请求前钩子,所有路由请求都会先执行这段逻辑
    @app.before_request
    def load_common_vars():
        # 把公共变量存入g对象,整个请求生命周期内都可访问
        if not hasattr(g, "company"):
            g.company = Company.query.first()
        # 其他需要共用的变量都可以在这里统一添加

    # 如果需要把变量自动暴露给所有模板,额外加这个上下文处理器
    @app.context_processor
    def inject_common_vars():
        return {"company": g.company}

    # 注册你的所有蓝图
    from blueprint_1.routes import blueprint_1
    from blueprint_2.routes import blueprint_2
    from blueprint_3.routes import blueprint_3
    app.register_blueprint(blueprint_1)
    app.register_blueprint(blueprint_2)
    app.register_blueprint(blueprint_3)

    return app
  1. 任意蓝图的路由中直接使用即可:
from flask import g

@blueprint_1.route("/test")
def test_route():
    # 直接访问g.company即可拿到实例
    print(g.company.name)
    # 模板中不需要手动传参,直接用{{ company.xxx }}调用
    return render_template("test.html")

如果company数据更新频率低,还可以给查询逻辑加缓存,减少不必要的数据库查询。


方案2:存入应用配置(适合静态不变的公共变量)

如果company数据启动后就不会变更,可以直接存在应用配置中:

def create_app():
    app = Flask(__name__)
    db.init_app(app)

    # 必须在应用上下文内执行数据库查询
    with app.app_context():
        app.config["COMPANY"] = Company.query.first()

    # 注册蓝图...
    return app

蓝图中调用方式:

from flask import current_app

@blueprint_1.route("/test")
def test_route():
    company = current_app.config["COMPANY"]
    print(company.name)

注意:不要直接在蓝图定义的顶层执行Company.query.first(),这会在导入蓝图时就执行查询,此时应用上下文还未初始化,很容易出现导入顺序错误。

内容的提问来源于stack exchange,提问作者Howard S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:24:04