FastAPI教程 路徑操作裝飾器依賴(lài)項(xiàng)

2021-11-03 09:33 更新

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

或者說(shuō),有些依賴(lài)項(xiàng)不返回值。

但仍要執(zhí)行或解析該依賴(lài)項(xiàng)。

對(duì)于這種情況,不必在聲明路徑操作函數(shù)的參數(shù)時(shí)使用 Depends,而是可以在路徑操作裝飾器中添加一個(gè)由 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"}]

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

提示

有些編輯器會(huì)檢查代碼中沒(méi)使用過(guò)的函數(shù)參數(shù),并顯示錯(cuò)誤提示。

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

使用路徑裝飾器依賴(lài)項(xiàng)還可以避免開(kāi)發(fā)新人誤會(huì)代碼中包含無(wú)用的未使用參數(shù)。

說(shuō)明

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

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

依賴(lài)項(xiàng)錯(cuò)誤和返回值

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

依賴(lài)項(xiàng)的需求項(xiàng)

路徑裝飾器依賴(lài)項(xiàng)可以聲明請(qǐng)求的需求項(xiàng)(比如響應(yīng)頭)或其他子依賴(lài)項(xiàng):

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ā)異常

路徑裝飾器依賴(lài)項(xiàng)與正常的依賴(lài)項(xiàng)一樣,可以 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"}]

返回值

無(wú)論路徑裝飾器依賴(lài)項(xiàng)是否返回值,路徑操作都不會(huì)使用這些值。

因此,可以復(fù)用在其他位置使用過(guò)的、(能返回值的)普通依賴(lài)項(xiàng),即使沒(méi)有使用這個(gè)值,也會(huì)執(zhí)行該依賴(lài)項(xiàng):

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"}]

為一組路徑操作定義依賴(lài)項(xiàng)

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

全局依賴(lài)項(xiàng)

接下來(lái),我們將學(xué)習(xí)如何為 FastAPI 應(yīng)用程序添加全局依賴(lài)項(xiàng),創(chuàng)建應(yīng)用于每個(gè)路徑操作的依賴(lài)項(xiàng)。


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)