5.7 KiB
Підзалежності
Ви можете створювати залежності, які мають підзалежності.
Вони можуть бути настільки глибокими, наскільки потрібно.
FastAPI подбає про їх розв'язання.
Перша залежність «dependable»
Можна створити першу залежність («dependable») так:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[8:9] *}
Вона оголошує необов'язковий параметр запиту q типу str, а потім просто повертає його.
Це досить просто (не дуже корисно), але допоможе зосередитися на тому, як працюють підзалежності.
Друга залежність, «dependable» і «dependant»
Далі ви можете створити іншу функцію залежності («dependable»), яка водночас оголошує власну залежність (тож вона також є «dependant»):
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[13] *}
Зосередьмося на оголошених параметрах:
- Хоча ця функція сама є залежністю («dependable»), вона також оголошує іншу залежність (вона «залежить» від чогось).
- Вона залежить від
query_extractorі присвоює значення, яке він повертає, параметруq.
- Вона залежить від
- Вона також оголошує необов'язкове кукі
last_queryтипуstr.- Якщо користувач не надав параметр запиту
q, ми використовуємо останній запит, який зберегли раніше в кукі.
- Якщо користувач не надав параметр запиту
Використання залежності
Потім ми можемо використати залежність так:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
/// info | Інформація
Зверніть увагу, що ми оголошуємо лише одну залежність у функції операції шляху — 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 знатиме, що цю підзалежність потрібно викликати лише один раз на запит.
І він збереже повернуте значення у «кеш» і передасть його всім «dependants», яким воно потрібне в цьому конкретному запиті, замість того щоб викликати залежність кілька разів для одного й того ж запиту.
У просунутому сценарії, коли ви знаєте, що залежність має викликатися на кожному кроці (можливо, кілька разів) у межах того самого запиту замість використання «кешованого» значення, ви можете встановити параметр 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 | Порада
Усе це може здаватися не надто корисним на простих прикладах.
Але ви побачите, наскільки це корисно, у розділах про безпеку.
І також побачите, скільки коду це вам заощадить.
///