有時,我們并不需要在路徑操作函數(shù)中使用依賴項(xiàng)的返回值。
或者說,有些依賴項(xiàng)不返回值。
但仍要執(zhí)行或解析該依賴項(xiàng)。
對于這種情況,不必在聲明路徑操作函數(shù)的參數(shù)時使用 Depends,而是可以在路徑操作裝飾器中添加一個由 dependencies 組成的 list。
路徑操作裝飾器支持可選參數(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"}]
路徑操作裝飾器依賴項(xiàng)(以下簡稱為“路徑裝飾器依賴項(xiàng)”)的執(zhí)行或解析方式和普通依賴項(xiàng)一樣,但就算這些依賴項(xiàng)會返回值,它們的值也不會傳遞給路徑操作函數(shù)。
提示
有些編輯器會檢查代碼中沒使用過的函數(shù)參數(shù),并顯示錯誤提示。
在路徑操作裝飾器中使用 dependencies 參數(shù),可以確保在執(zhí)行依賴項(xiàng)的同時,避免編輯器顯示錯誤提示。
使用路徑裝飾器依賴項(xiàng)還可以避免開發(fā)新人誤會代碼中包含無用的未使用參數(shù)。
說明
本例中,使用的是自定義響應(yīng)頭 X-Key 和 X-Token。
但實(shí)際開發(fā)中,尤其是在實(shí)現(xiàn)安全措施時,最好使用 FastAPI 內(nèi)置的安全工具(詳見下一章)。
路徑裝飾器依賴項(xiàng)也可以使用普通的依賴項(xiàng)函數(shù)。
路徑裝飾器依賴項(xiàng)可以聲明請求的需求項(xiàng)(比如響應(yīng)頭)或其他子依賴項(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"}]
路徑裝飾器依賴項(xiàng)與正常的依賴項(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"}]
無論路徑裝飾器依賴項(xiàng)是否返回值,路徑操作都不會使用這些值。
因此,可以復(fù)用在其他位置使用過的、(能返回值的)普通依賴項(xiàng),即使沒有使用這個值,也會執(zhí)行該依賴項(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"}]
稍后,大型應(yīng)用 - 多文件一章中會介紹如何使用多個文件創(chuàng)建大型應(yīng)用程序,在這一章中,您將了解到如何為一組路徑操作聲明單個 dependencies 參數(shù)。
接下來,我們將學(xué)習(xí)如何為 FastAPI 應(yīng)用程序添加全局依賴項(xiàng),創(chuàng)建應(yīng)用于每個路徑操作的依賴項(xiàng)。
更多建議: