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/

  • 相关阅读:
    目标跟踪_POI算法
    深度学习-Maxpool
    HOG特征
    R CNN
    颜色空间
    数值分析-非线性方程的数值解法
    数值分析-一些小小的知识点
    数值分析-求微分
    多元统计分析-因子分析
    最优化-可行方向法
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/13073754.html
Copyright © 2011-2022 走看看