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
相关产品推荐
相关产品推荐

