作者:麥克煎蛋 出處: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/