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

FastAPI结合dependency-injector注入依赖时出现Provide对象无test属性错误

排查解决步骤

1. 补充路由函数的@inject装饰器

这是最高频的错误原因:dependency-injector要求所有需要注入依赖的函数必须显式添加@inject装饰器才能解析Provide标记,普通函数你已经加了所以正常,路由函数遗漏的话就会直接拿到未解析的Provide对象。
修改users.py代码如下:

# 先导入inject
from dependency_injector.wiring import inject, Provide
from fastapi import Depends

@router.get('/u/{name}/{id}')
@inject  # 新增该行装饰器
def add_user(name:str, id:int, strategy_service:StrategyService = Depends(Provide[Container.strategy_service])):
    strategy_service.test(Test(name, id))

2. 修正wire的覆盖范围

你当前container.wire(packages=[api])的配置可能没有覆盖到端点所在的模块,导致Provide标记无法被扫描替换。可以两种方式修正:

  • 直接指定端点模块,避免路径扫描失败:
# main.py中修改wire配置
container.wire(modules=[
    "app.api.v1.endpoints.users"
])
  • 确认packages参数的路径和项目导入路径一致,如果你的api模块在app包下,需要写成packages=["app.api"],同时确保api包的__init__.py中已经导入了所有端点模块。

3. 检查导入顺序

必须保证先初始化Container、执行wire操作,再导入路由相关的模块。如果在main.py开头就提前导入了users.py的路由,此时函数已经加载完成,后续的wire操作不会生效。你可以把路由导入逻辑移到wire之后:

def create_app() -> FastAPI:
    container = Container()
    container.config.from_yaml('../config.yml')
    container.wire(modules=["app.api.v1.endpoints.users"])
    
    app = FastAPI()
    app.container = container
    
    # wire之后再导入路由
    from app.api.v1 import api_v1
    app.include_router(api_v1.router, prefix='/api/v1')
    
    return app

4. 验证排查

修改完成后可以在路由函数中打印strategy_service的类型,确认返回的是StrategyService实例而非Provide对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:09:03