什麼是 yield?
在 FastAPI 的依賴注入中,yield 主要用於建立「帶有清理功能的依賴項」。簡單來說,使用 return 的依賴項只負責「創建」資源,而使用 yield 的依賴項則能同時處理「準備資源」與「清理資源」。
yield 執行流程
- Setup:
yield之前的程式碼,在進入路徑操作函式前執行。 - yield:將值傳遞給路徑操作函式。
- Teardown:
yield之後的程式碼,在回應發送後執行。
常見錯誤與解決方法
- 務必將
yield放在try區塊中,並將清理邏輯放在finally區塊中,這確保了無論路徑操作是否成功,資源都能被正確關閉。 - 如果需處理錯誤,請在
yield之前或透過背景任務處理,不要在finally區塊中試圖改變HTTP回應。
from fastapi import FastAPI, Depends
app = FastAPI()
# 模擬資料庫類別
class MockDB:
def close(self):
print("資料庫連線已關閉 (Teardown)")
# 帶有 yield 的依賴項
async def get_db():
print("建立資料庫連線 (Setup)")
db = MockDB()
try:
yield db # 暫停執行,將 db 交給路徑函數
finally:
db.close() # 回應發送後執行
@app.get("/items/")
async def read_items(db: MockDB = Depends(get_db)):
print("正在處理請求 (Path Operation)")
return {"message": "Hello World"}
# 預期輸出順序:
# 1. 建立資料庫連線 (Setup)
# 2. 正在處理請求 (Path Operation)
# 3. 資料庫連線已關閉 (Teardown)











