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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM