Зависимости в декораторах операций пути
В некоторых случаях вам на самом деле не нужно возвращаемое значение зависимости внутри вашей функции операции пути.
Или зависимость не возвращает значение.
Но вам всё равно нужно, чтобы она была выполнена/разрешена.
В таких случаях вместо объявления параметра функции операции пути с Depends вы можете добавить list из dependencies в декоратор операции пути.
Добавление dependencies в декоратор операции пути
Декоратор операции пути принимает необязательный аргумент dependencies.
Это должен быть list из Depends():
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 в декораторе операции пути, вы можете гарантировать их выполнение и избежать ошибок редактора/инструментов.
Это также поможет избежать недоразумений у новых разработчиков, которые могут увидеть неиспользуемый параметр в коде и решить, что он не нужен.
Примечание
В этом примере мы используем вымышленные пользовательские заголовки X-Key и X-Token.
Но в реальных случаях при реализации системы безопасности вы получите больше преимуществ, используя встроенные утилиты безопасности (следующая глава).
Ошибки зависимостей и возвращаемые значения
Вы можете использовать те же функции зависимостей, что и обычно.
Требования зависимостей
Они могут объявлять требования к запросу (например, заголовки) или другие вложенные зависимости:
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, чтобы они применялись к каждой операции пути.
© 2018 Sebastián Ramírez
Licensed under the MIT License.
https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/