随笔 - 214  文章 - 12  评论 - 40  阅读 - 38万

FastAPI 依赖注入系统(五) 带有yield功能的依赖项

作者:麦克煎蛋   出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!

 

FastAPI支持依赖项在请求结束后做一些额外的工作。

要实现这个功能,我们需要用yield代替return,然后其后添加一些额外的工作

 

工程示例

这是一个依赖项函数的例子,我们可以创建一个数据库session,然后在请求结束后关闭这个session。

async def get_db():
    db = DBSession()
    try:
        yield db
    finally:
        db.close()

yield db后面的值db会注入给路径操作或者其他依赖项。

yield db后面的代码在response提交之后才会执行。

 

我们这里用try语句来捕获可能发生的异常。

为了确保无论是否有异常发生都能执行退出逻辑,我们这里在finally语句中执行退出逻辑。

但是要注意,如果尝试在yield后面抛出HTTPException,不会起到任何作用。yield之后的退出代码是在异常处理器之后被执行的,因此无法捕捉异常的发生。

 

上下文管理器

当我们创建一个带有yield功能的依赖项,FastAPI实际上内部会把它转换成一个上下文管理器,并且与其他的一些工具结合使用。

我们也可以实现一个支持yield功能的依赖项类:

复制代码
class MySuperContextManager:
    def __init__(self):
        self.db = DBSession()

    def __enter__(self):
        return self.db

    def __exit__(self, exc_type, exc_value, traceback):
        self.db.close()
复制代码
async def get_db():
    with MySuperContextManager() as db:
        yield db

 

 

 

关于上下文管理器,可以参考下面这边文章:

https://www.cnblogs.com/wongbingming/p/10519553.html

 

关于本篇文章的更多细节,可以参考原文(这里做了简略,但核心思想一致):

https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/

posted on   麦克煎蛋  阅读(1434)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示