FastAPI教程 路徑操作裝飾器依賴項

2021-11-03 09:33 更新

有時,我們并不需要在路徑操作函數(shù)中使用依賴項的返回值。

或者說,有些依賴項不返回值。

但仍要執(zhí)行或解析該依賴項。

對于這種情況,不必在聲明路徑操作函數(shù)的參數(shù)時使用 Depends,而是可以在路徑操作裝飾器中添加一個由 dependencies 組成的 list。

在路徑操作裝飾器中添加 dependencies 參數(shù)

路徑操作裝飾器支持可選參數(shù) ~ dependencies。

該參數(shù)的值是由 Depends() 組成的 list:

from fastapi import Depends, FastAPI, Header, HTTPException

app = FastAPI()


async def verify_token(x_token: str = Header(...)):
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")


async def verify_key(x_key: str = Header(...)):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")
    return x_key


@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items():
    return [{"item": "Foo"}, {"item": "Bar"}]

路徑操作裝飾器依賴項(以下簡稱為“路徑裝飾器依賴項”)的執(zhí)行或解析方式和普通依賴項一樣,但就算這些依賴項會返回值,它們的值也不會傳遞給路徑操作函數(shù)。

提示

有些編輯器會檢查代碼中沒使用過的函數(shù)參數(shù),并顯示錯誤提示。

在路徑操作裝飾器中使用 dependencies 參數(shù),可以確保在執(zhí)行依賴項的同時,避免編輯器顯示錯誤提示。

使用路徑裝飾器依賴項還可以避免開發(fā)新人誤會代碼中包含無用的未使用參數(shù)。

說明

本例中,使用的是自定義響應頭 X-Key 和 X-Token。

但實際開發(fā)中,尤其是在實現(xiàn)安全措施時,最好使用 FastAPI 內(nèi)置的安全工具(詳見下一章)。

依賴項錯誤和返回值

路徑裝飾器依賴項也可以使用普通的依賴項函數(shù)。

依賴項的需求項

路徑裝飾器依賴項可以聲明請求的需求項(比如響應頭)或其他子依賴項:

from fastapi import Depends, FastAPI, Header, HTTPException

app = FastAPI()


async def verify_token(x_token: str = Header(...)):
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")


async def verify_key(x_key: str = Header(...)):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")
    return x_key


@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items():
    return [{"item": "Foo"}, {"item": "Bar"}]

觸發(fā)異常

路徑裝飾器依賴項與正常的依賴項一樣,可以 raise 異常:

from fastapi import Depends, FastAPI, Header, HTTPException

app = FastAPI()


async def verify_token(x_token: str = Header(...)):
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")


async def verify_key(x_key: str = Header(...)):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")
    return x_key


@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items():
    return [{"item": "Foo"}, {"item": "Bar"}]

返回值

無論路徑裝飾器依賴項是否返回值,路徑操作都不會使用這些值。

因此,可以復用在其他位置使用過的、(能返回值的)普通依賴項,即使沒有使用這個值,也會執(zhí)行該依賴項:

from fastapi import Depends, FastAPI, Header, HTTPException

app = FastAPI()


async def verify_token(x_token: str = Header(...)):
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")


async def verify_key(x_key: str = Header(...)):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")
    return x_key


@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items():
    return [{"item": "Foo"}, {"item": "Bar"}]

為一組路徑操作定義依賴項

稍后,大型應用 - 多文件一章中會介紹如何使用多個文件創(chuàng)建大型應用程序,在這一章中,您將了解到如何為一組路徑操作聲明單個 dependencies 參數(shù)。

全局依賴項

接下來,我們將學習如何為 FastAPI 應用程序添加全局依賴項,創(chuàng)建應用于每個路徑操作的依賴項。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號