Flask中python-dependency-injector注入服务至路由方法失败问题
问题解决:Flask中python-dependency-injector注入失败的问题
你的代码存在几个关键问题导致依赖注入未生效,以下是修复步骤和解释:
问题分析
报错AttributeError: 'Provide' object has no attribute 'getMessage'说明依赖注入没有完成,my_service参数仍然是Provide标记对象,而非MyService的实例。主要原因包括:
- 代码执行顺序错误:
app.run()在路由定义前调用,导致路由未注册、依赖注入的wiring逻辑未执行 - 容器wiring未显式初始化:仅在容器类中定义
wiring_config不足以完成绑定,需要显式触发wiring - 类成员缩进错误:
Container类中my_service的缩进不符合Python语法规范
修复后的完整代码
from flask import Flask from dependency_injector import containers, providers from dependency_injector.wiring import inject, Provide class MyService: def getMessage(self): return "Hello World!" class Container(containers.DeclarativeContainer): # 修正缩进:与wiring_config同级别 my_service = providers.Factory(MyService) wiring_config = containers.WiringConfiguration( modules=[__name__], ) app = Flask(__name__) container = Container() # 显式初始化容器的wiring,完成依赖绑定 container.wire(modules=[__name__]) @app.route('/') @inject def hello_world(my_service: MyService = Provide[Container.my_service]): return my_service.getMessage() # 将app.run()移到最后,确保路由和依赖注入逻辑都已加载 if __name__ == '__main__': app.run()
关键修复点说明
- 调整代码顺序:把
app.run()移到所有路由定义和容器初始化之后,确保Flask能注册路由,同时依赖注入的绑定逻辑先执行 - 显式调用
container.wire():这一步会根据wiring_config的配置,将容器中的服务绑定到标记了@inject的函数参数上 - 修正缩进:
Container类中的my_service成员需要和wiring_config保持同一缩进层级,避免语法错误
运行修复后的代码,访问http://localhost:5000就能正常返回Hello World!了。
内容的提问来源于stack exchange,提问作者Eugeniu Znagovan
相关产品推荐
相关产品推荐

