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

