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/