4.1 Внедрение функций и классов зависимости
5 из 5 шагов пройдено
1 из 1 баллa  получен

Класс Depends отвечает за выполнение внедрения зависимостей в приложениях FastAPI, который позволяет вам добавить зависимость к вашему API-методу. Это означает, что выполнение этого метода зависит от выполнения другой функции или условия.

Преимущества этого подхода:

  • Разделение функционала: Мы можем сосредоточиться на бизнес-логике, а не на создании дополнительных общих объектов. Например, если есть конечная точка, которая принимает данные формы контакта и отправляет электронное письмо. Мы можем разделить часть настройки почтового клиента.
  • Общая логика: Мы можем извлечь общую логику. Общий фрагмент кода может быть объявлен один раз и на него можно ссылаться снова и снова. Для, например в API очень часто добавляют в базу данных и получают информацию или обновляют информацию. Для этих задач нам нужен сеанс базы данных. Если мы напишем код, чтобы получить сеанс базы данных для каждой конечной точки, то это загромоздит наш код. Вместо этого мы можем извлечь эту часть и просто ссылаться на нее в каждой конечной точке.
  • Тестирование: FastAPI позволяет очень легко переопределять зависимости во время тестирования. Это помогает нам избежать ненужного исправления кода.

 

Внедрение функции зависимости

Давайте создадим новый проект, так как я работаю в PyCharm версии Professional Edition, я создам сразу проект FastAPI. Если вы работаете в других редакторах кода, то необходимо создать проект как мы изучали ранее в курсе.

Работать мы будем в файле main.py, добавим в него несколько эндпоинтов.

from fastapi import FastAPI, Depends

app = FastAPI()


@app.get("/messages")
async def all_messages(limit: int = 10, page: int = 1):
    return {"messages": [{'limit': limit, 'page': page}]}


@app.get("/comments")
async def all_comments(limit: int = 10, page: int = 1):
    return {"comments": [{'limit': limit, 'page': page}]}

Мы добавили в наш проект 2 конечные точки в качестве примера. Как мы видим, наши конечные точки получают одни и те же параметры - limit, это количество записей на страницу и page, это номер страницы. Например, используя пагинацию, первая конечная точка будет выводить все сообщения из нашей БД, а вторая точка будет выводить все комментарии. Мы эту логику не будем реализовывать, основная цель данного модуля, показать как мы можем использовать зависимости в наших проектах.

Запустим сервер командой uvicorn main:app --port 8000 --reload и проверим работу перейдя в документацию и отправив запрос:

Если мы внимательно посмотрим на код, то поймем, что у нас есть дублирование кода в плане параметров которые получают наши конечные точки. И также если у нас будет большой проект, то нам будет не совсем удобно редактировать эти параметры по умолчанию или вносить различные изменения. В следующем шаге мы попробуем решить эту проблему использовав зависимости в FastAPI.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.

'Если вы работаете в других редакторах кода, то необходимо создать проект как мы изучали ранее в курсе.'(C) - Коллеги, гляньте,  на утро 02 мая ссылка битая.

@app.get("/messages")

    async def all_message(limit: int = 10, page: int = 1):

    return {"messages": [{'limit': limit, 'page': page}]}

Возможно функцию стоит назвать "all_messages"?

@Алексей_Бойко, Все поправил, спасибо.