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

Flask蓝图拆分代码后,如何跨文件访问Controller单例对象?

Flask Blueprint拆分后跨文件访问Controller实例的解决方法

核心思路:利用Flask的current_app访问全局应用实例

避免循环导入的关键是不在路由文件中直接导入server.py的内容,而是通过Flask提供的current_app对象获取挂载在应用上的Controller实例。

步骤1:在server.py中将Controller实例挂载到Flask应用

修改server.py,初始化Controller后,将其直接绑定到Flask app的属性上:

# server.py
from flask import Flask
from your_module import Controller  # 假设Controller定义在单独模块或当前文件
# 注意:蓝图导入要放在app和controller初始化之后,避免循环
from routes import bp  

# 初始化核心实例
controller = Controller()
app = Flask(__name__)

# 将Controller实例挂载到app属性上
app.controller = controller

# 注册蓝图
app.register_blueprint(bp)

if __name__ == "__main__":
    app.run()

步骤2:在routes.py中通过current_app访问Controller

在路由函数内,通过current_app获取挂载的Controller实例,无需直接导入server.py:

# routes.py
from flask import Blueprint, current_app

bp = Blueprint('main', __name__)

@bp.route('/run')
def run():
    current_app.controller.run()
    return "Started"

@bp.route('/stop')
def stop():
    current_app.controller.stop()
    return "Stopped"

补充:修复“存入app配置”的方案(若你想继续用此方式)

如果之前尝试存app配置失败是拼写错误,可按以下方式修正:

# server.py中配置Controller
app.config['MY_CONTROLLER'] = controller

# routes.py中获取
@bp.route('/run')
def run():
    current_app.config['MY_CONTROLLER'].run()
    return "Started"

注意配置键名要完全统一,避免拼写错误。

关键注意事项

  • 确保server.py作为入口文件,先初始化app和Controller,再导入蓝图,彻底规避循环导入问题。
  • current_app仅能在Flask的请求上下文或应用上下文内使用,路由函数本身处于请求上下文环境中,可直接调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:50:08