我有以下路線規格:
GET /councils/{id}
PUT /councils/{id}
DELETE /councils/{id}
在所有三個路線中,我都必須在資料庫中檢查是否id存在理事會,如下所示:
council = crud.council.get_by_id(db=db, id=id)
if not council:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail='Council not found'
)
這增加了代碼中的許多樣板。有沒有辦法減少這種情況?我曾想過創建一個依賴項,但是我必須為我的資料庫中的不同模型撰寫不同的依賴項函式。這有什么標準做法嗎?謝謝。
uj5u.com熱心網友回復:
使用依賴是可行的方法 - 它允許您提取圍繞“從 URL 獲取有效委員會”的邏輯;如果您想映射/<model>/<id>到始終從特定模型中檢索某些內容,您可以進一步概括它;但是 - 您可能希望根據一組可能的值來驗證這一點,以避免人們試圖讓您在模型類中加載隨機 Python 識別符號。
from fastapi import Path
def get_council_from_path(council_id: int = Path(...),
db: Session = Depends(get_db),
):
council = crud.council.get_by_id(db=db, id=id)
if not council:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail='Council not found'
)
return council
@app.get('/councils/{council_id}')
def get_council(council: Council = Depends(get_council_from_path)):
pass
您可以概括依賴項定義以使其可重用(我現在沒有任何可用于測驗的東西,但這個想法應該可行):
def get_model_from_path(model, db: Session = Depends(get_db)):
def get_model_from_id(id: int = Path(...)):
obj = model.get_by_id(db=db, id=id)
if not council:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail='{type(model)} not found'
)
return get_model_from_id
@app.get('/councils/{id}')
def get_council(council: Council = Depends(get_model_from_path(crud.council)):
pass
uj5u.com熱心網友回復:
這是一種有效的解決方案。FastAPI 支持將類作為依賴項。因此我可以有這樣的課程:
class DbObjIdValidator:
def __init__(self, name: str):
if name not in dir(crud):
raise ValueError('Invalid model name specified')
self.crud = getattr(crud, name)
def __call__(self, db: Session = Depends(get_db), *, id: Any):
db_obj = self.crud.get_by_id(db=db, id=id)
if not db_obj:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail='not found'
)
return db_obj
考慮crud模塊匯入所有 ORM 模型的 crud 類。我的示例緊跟 Tiangolo 的fastAPI cookiecutter 專案,以及他遵循的 crud 設計模式。
現在為了使用它,例如在 中councils_route.py,我可以執行以下操作:
router = APIRouter(prefix='/councils')
council_id_dep = DbObjIdValidator('council') # name must be same as import name
@router.get('/{id}', response_model=schemas.CouncilDB)
def get_council_by_id(
id: UUID,
db: Session = Depends(get_db),
council: Councils = Depends(council_id_dep)
):
return council
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/495942.html
標籤:python-3.x api 依赖注入 快速API
上一篇:從Angular訪問API
