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

