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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:52:40