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

FastAPI集成Dependency Injector报错:method对象不支持上下文管理器协议

问题解决:'method' object does not support the context manager protocol

问题场景

开发FastAPI应用时,使用Dependency Injector管理依赖,JobService通过SQLAlchemy与数据库交互,创建新Job时触发如下错误:

TypeError: 'method' object does not support the context manager protocol

错误栈指向JobService.create_new_job方法中的with self.session_factory() as session:语句。

问题根源

在containers.py的依赖配置中,注入的mysql_session_factory是未绑定到实例的方法对象,而非可直接使用的上下文管理器:

job_service = providers.Factory(
    JobService,
    job_dao=job_dao,
    mysql_session_factory=mysql_db.provided.session,  # 注入的是方法引用,不是调用后的上下文管理器
)

当JobService中调用self.session_factory()时,实际得到的是MySQLDatabase.session方法本身,而不是调用该方法生成的上下文管理器,因此无法在with语句中使用。

解决方案

有两种可行的修改方式,任选其一即可:

方式1:用Lambda包装方法调用

修改containers.py中的job_service配置,通过lambda调用session方法并返回上下文管理器:

job_service = providers.Factory(
    JobService,
    job_dao=job_dao,
    mysql_session_factory=lambda: mysql_db().session(),  # 调用session方法获取上下文管理器
)

方式2:使用Dependency Injector的Callable提供者

利用providers.Callable包装方法调用,确保注入的是可生成上下文管理器的可调用对象:

from dependency_injector import containers, providers

class Container(containers.DeclarativeContainer):
    # ... 其他配置 ...

    mysql_session_factory = providers.Callable(
        lambda: mysql_db().session()
    )

    job_service = providers.Factory(
        JobService,
        job_dao=job_dao,
        mysql_session_factory=mysql_session_factory,
    )

验证修改

修改后,JobService中的self.session_factory()会返回MySQLDatabase.session方法生成的上下文管理器,此时with self.session_factory() as session:语句可以正常执行,完成数据库会话的创建、提交/回滚和关闭流程。

内容的提问来源于stack exchange,提问作者Sami Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:40:13