Co-authored-by: pr-submit[bot] <pr-submit[bot]@users.noreply.github.com> Co-authored-by: pr-push[bot] <pr-push[bot]@users.noreply.github.com>
6.4 KiB
Подзависимости
Вы можете создавать зависимости, которые имеют подзависимости.
Их вложенность может быть любой глубины.
FastAPI сам займётся их разрешением.
Первая «зависимость»
Можно создать первую «зависимость» следующим образом:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[8:9] *}
Она объявляет необязательный параметр запроса q как str, а затем возвращает его.
Это довольно просто (хотя и не очень полезно), но поможет нам сосредоточиться на том, как работают подзависимости.
Вторая зависимость, «зависимость» и «зависимая»
Затем можно создать еще одну функцию зависимости, которая одновременно объявляет свою собственную зависимость (таким образом, она тоже является «зависимой»):
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[13] *}
Остановимся на объявленных параметрах:
- Несмотря на то, что эта функция сама является зависимостью, она также объявляет другую зависимость (она «зависит» от чего-то другого).
- Она зависит от
query_extractorи присваивает возвращаемое ей значение параметруq.
- Она зависит от
- Она также объявляет необязательный куки-параметр
last_queryтипаstr.- Если пользователь не указал параметр
qв запросе, то мы используем последний использованный запрос, который мы ранее сохранили в cookie.
- Если пользователь не указал параметр
Использование зависимости
Затем мы можем использовать зависимость следующим образом:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
/// note | Примечание
Обратите внимание, что мы объявляем только одну зависимость в функции-обработчике пути - query_or_cookie_extractor.
Но FastAPI будет знать, что сначала он должен выполнить query_extractor, чтобы передать результаты этого в query_or_cookie_extractor при его вызове.
///
graph TB
query_extractor(["query_extractor"])
query_or_cookie_extractor(["query_or_cookie_extractor"])
read_query["/items/"]
query_extractor --> query_or_cookie_extractor --> read_query
Использование одной и той же зависимости несколько раз
Если одна из ваших зависимостей объявлена несколько раз для одной и той же операции пути, например, несколько зависимостей имеют общую подзависимость, FastAPI будет знать, что вызывать эту подзависимость нужно только один раз за HTTP-запрос.
При этом возвращаемое значение будет сохранено в «кэш» и будет передано всем "зависимым" функциям, которые нуждаются в нем внутри этого конкретного HTTP-запроса, вместо того, чтобы вызывать зависимость несколько раз для одного и того же HTTP-запроса.
В расширенном сценарии, когда вы знаете, что вам нужно, чтобы зависимость вызывалась на каждом шаге (возможно, несколько раз) в одном и том же HTTP-запросе, вместо использования "кэшированного" значения, вы можете установить параметр use_cache=False при использовании Depends:
//// tab | Python 3.10+
async def needy_dependency(
fresh_value: Annotated[str, Depends(get_value, use_cache=False)],
):
return {"fresh_value": fresh_value}
////
//// tab | Python 3.10+ без Annotated
/// tip | Подсказка
Предпочтительнее использовать версию с Annotated, если это возможно.
///
async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):
return {"fresh_value": fresh_value}
////
Резюме
Помимо всех этих умных слов, используемых здесь, система внедрения зависимостей довольно проста.
Это просто функции, которые выглядят так же, как функции-обработчики путей.
Но, тем не менее, эта система очень мощная и позволяет вам объявлять вложенные графы (деревья) зависимостей сколь угодно глубоко.
/// tip | Подсказка
Все это может показаться не столь полезным на этих простых примерах.
Но вы увидите, как это пригодится в главах, посвященных безопасности.
И вы также увидите, сколько кода это вам сэкономит.
///