zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    使用 Spring data redis 结合 Spring cache 缓存数据配置
    Spring Web Flow 笔记
    Linux 定时实行一次任务命令
    css js 优化工具
    arch Failed to load module "intel"
    go 冒泡排序
    go (break goto continue)
    VirtualBox,Kernel driver not installed (rc=-1908)
    go运算符
    go iota
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/13073754.html
Copyright © 2011-2022 走看看