Python Flask 如何将变量传递到多个蓝图的所有路由中
问题分析
你之前在create_app中定义变量不生效,是因为普通局部变量无法被外部的蓝图模块访问,必须将公共变量放到Flask提供的全局可访问对象中才能实现跨蓝图共用,下面是两种成熟的实现方案:
方案1:上下文处理器 + g对象(路由、模板通用,推荐)
适合公共变量需要动态更新、同时要在路由和模板中使用的场景,一次定义全应用生效:
- 在
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
- 任意蓝图的路由中直接使用即可:
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
相关产品推荐
相关产品推荐

