路径操作装饰器中的依赖项¶
在某些情况下,你并不需要在路径操作函数内部使用依赖项的返回值。
或者该依赖项本身就不返回任何值。
但你仍然需要它被执行/解析。
针对这些情况,你可以向路径操作装饰器添加一个 dependencies 的 list,而不是在路径操作函数中声明使用 Depends 的参数。
向路径操作装饰器添加 dependencies¶
路径操作装饰器接收一个可选参数 dependencies。
它应该是一个包含 Depends() 的 list。
from typing import Annotated
from fastapi import Depends, FastAPI, Header, HTTPException
app = FastAPI()
async def verify_token(x_token: Annotated[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: Annotated[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"}]
🤓 其他版本和变体
提示
如果可能,请优先使用 Annotated 版本。
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"}]
这些依赖项将以与普通依赖项相同的方式被执行/解析。但它们的值(如果它们有返回值)不会被传递给你的路径操作函数。
提示
一些编辑器会检查未使用的函数参数,并将它们显示为错误。
通过在路径操作装饰器中使用这些 dependencies,你可以确保它们被执行,同时避免编辑器/工具报错。
这也有助于避免新开发人员感到困惑,因为他们看到代码中存在未使用的参数时,可能会误以为这是多余的。
依赖项错误和返回值¶
你可以像平时一样使用相同的依赖函数。
依赖项要求¶
它们可以声明请求要求(如请求头)或其他子依赖项。
from typing import Annotated
from fastapi import Depends, FastAPI, Header, HTTPException
app = FastAPI()
async def verify_token(x_token: Annotated[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: Annotated[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"}]
🤓 其他版本和变体
提示
如果可能,请优先使用 Annotated 版本。
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"}]
抛出异常¶
这些依赖项可以 raise 异常,与普通依赖项相同。
from typing import Annotated
from fastapi import Depends, FastAPI, Header, HTTPException
app = FastAPI()
async def verify_token(x_token: Annotated[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: Annotated[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"}]
🤓 其他版本和变体
提示
如果可能,请优先使用 Annotated 版本。
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"}]
返回值¶
它们可以返回或不返回值,无论如何,这些值都不会被使用。
因此,你可以复用你在其他地方已经使用的普通依赖项(即使它有返回值),尽管返回值不会被使用,该依赖项依然会被执行。
from typing import Annotated
from fastapi import Depends, FastAPI, Header, HTTPException
app = FastAPI()
async def verify_token(x_token: Annotated[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: Annotated[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"}]
🤓 其他版本和变体
提示
如果可能,请优先使用 Annotated 版本。
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"}]
一组路径操作的依赖项¶
稍后,当你阅读关于如何构建大型应用程序(大型应用程序 - 多个文件)的内容时,特别是涉及多个文件的情况,你将学习如何为一组路径操作声明单一的 dependencies 参数。
全局依赖项¶
接下来,我们将了解如何将依赖项添加到整个 FastAPI 应用程序中,从而使它们应用于每一个路径操作。