Найти тему
Заходи в Ай-Ти

FastAPI - создание web-приложения. Часть 10 (Пилим роуты для блога)

Оглавление

Вспоминаем прошлые уроки

Недавно мы создали запись в таблице пользователей, поэтому у нас есть поле author_id для создания нового блога. Давайте создадим новый блог, используя запрос для создания публикаци (подобную операию мы производили в прошлой убликации). Не стесняйтесь попробовать это самостоятельно.

Нам нужны 3 новых файла:

Новая структура файлов
Новая структура файлов

Пилим роут для создания блога

Введите следующий код в route_blog.py:

Роут для создания нового поста в блоге
Роут для создания нового поста в блоге

Делаем то же самое, создаем маршрут, который будет получать данные для создания блога методом POST. Он проверит полученные данные с помощью схемы CreateBlog. Единственная загвоздка в том, что мы не будем запрашивать у пользователей пул, а создадим его на основе предоставленного заголовка. Поскольку мы хотим выполнить генерацию пула еще до того, как данные тела запроса будут проверены Pydantic, нам придется поместить ключевое слово pre=True в наш валидатор. Итак, давайте создадим необходимые схемы. Введите следующее в разделе schemas > blog.py.

schemas/blog.py
schemas/blog.py

Поскольку мы используем шаблон репозитория и хотим, чтобы логика базы данных или базы данных была полностью отделена от логики маршрутов fastapi, нам нужно создать новую функцию с именем «create_new_blog» для логики создания. Давайте создадим этот файл db > repository > blog.py.

db > repository > blog.py
db > repository > blog.py

Это еще один пример формы sqlalchemy. Создаем новую запись в базе данных с помощью ORM. Тем не менее, наше приложение fastapi не знает об этой новой функции. Итак, нам нужно импортировать маршрут create_blog в apis > base.py.

apis > base.py
apis > base.py

Создаем роут для восстановления блога

Думаю, вы еще помните самый первый пост (если не читал, тыкай сюда), где я рассказал вам разницу между запросами get, post, put, patch и delete. В этом посте мы собираемся изучить GET-запросы. Сначала мы реализуем маршрут, который возвращает данные о сообщении блога по его идентификатору. На этот раз у нас уже есть все существующие файлы. Просто добавьте следующий код в apis > v1 > route_blog.py.

apis > v1 > route_blog.py
apis > v1 > route_blog.py

Так как наша база данных и логика ORM будут находиться в папке repository. Итак, давайте добавим следующие строки в файл db > repository > blog.py:

db > repository > blog.py:
db > repository > blog.py:
  • Этот запрос создан на базе sqlalchemy.
  • Это эквивалентно: select * from blog where id = 1;  # id = given_id
  • База данных найдет блог и вернет результат. Мы проверяем, что этот возвращенный элемент не является пустым. В случае его отсутствия мы создаем исключение HTTPException, чтобы информировать наших пользователей о проблеме

Роут для получения списка всех блогов

В типичном представлении пользователей блог - список постов, а не одна единственная запись. Не обязательно всегда показывать полный список карточек. Это может быть список строк в таблице или даже список элементов в необработанном формате!

Вообще в любом API у нас есть 5 типов операций:

  • Список
  • Получить (получить одну запись из БД)
  • Опубликовать (создать новую запись в БД)
  • Установить/Патчить (Обновить запись)
  • Удалить (Удалить запись из БД)

В этом посте мы собираемся реализовать это представление списка. Нам нужно добавить новый роут в apis > v1 > route_blog.py.

apis > v1 > route_blog.py
apis > v1 > route_blog.py

Поскольку нам не нужен какой-либо идентификатор или какие-либо данные для получения, мы просто используем сессию с бд. Обратите внимание, что мы используем внедрение зависимостей вместо жесткого кодирования базы данных. Это поможет нам переопределить db во время наших тестов. Нам нужно создать функцию list_blogs в db > repository > blog.py , которая фактически будет извлекать все блоги из базы данных и возвращать результат на наш маршрут. Наконец, мы возвращаем все блоги с маршрута клиенту/браузеру и во время этого процесса проверяем, что атрибуты фильтруются с использованием схемы ShowBlog. Поскольку на самом деле мы возвращаем список [ ] блогов схемы ShowBlog, поэтому мы использовали List[ShowBlog]. Давайте реализуем функцию list_blogs в db > repository > blog.py

новая функция в db > repository > blog.py
новая функция в db > repository > blog.py

Готово. Теперь все, что нам нужно, это сделать активными хотя бы 1 или 2 блога. Мы можем открыть PgAdmin, перейти к таблице с именем blog, щелкнуть ее правой кнопкой мыши, выбрать «Инструмент запросов» и выполнить приведенный ниже запрос, чтобы сделать блог активным.

команда, которую нужно ввести в консоли запросов PGAdmin, чтобы сделать блог активным
команда, которую нужно ввести в консоли запросов PGAdmin, чтобы сделать блог активным

Пришло время протестировать наш API с помощью документации. Перейдите к документации API (http://127.0.0.1/docs), и при нажатии кнопки «Выполнить» вы должны получить список блогов.

Создание роута для обновления блога

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

Для начала создадим схему. Поскольку нам нужна та же информация, что и для создания публикации в блоге, мы можем просто наследовать схему CreateBlog. Давайте сделаем это в schemas > blog.py.

chemas > blog.py
chemas > blog.py

Давайте реализуем новый маршрут в apis > v1 > route_blog.py.

apis > v1 > route_blog.py
apis > v1 > route_blog.py

Наш маршрутизатор принимает идентификатор ({id}) в параметре пути и проверяет, передается ли правильная схема блога в теле запроса, используя схему UpdateBlog. Этот маршрут зависит от репозитория в db > repository > blog.py.

 db > repository > blog.py
db > repository > blog.py

Функция update_blog не требует пояснений (если требует, напишите в комментарии, я подробнее расскажу). Мы просто ищем, существует ли блог с данным идентификатором в базе данных. Если блог существует, мы обновляем заголовок и содержимое, используя их (они есть в теле запроса).

Создание роута для удаления блога

Точно так же, как и необходимость обновления, иногда мы пишем несколько 💩 (включая меня). В таких случаях нам необходимо удалить сообщение в блоге. Чтобы включить удаление сообщения, нам нужно будет создать маршрут и запросы ORM, поддерживающие этот маршрут. Давайте продолжим.

apis > v1 > route_blog.py
apis > v1 > route_blog.py

Нам также нужен запрос к репозиторию ORM, который поддерживает удаление объекта блога. Для этого нам нужно будет создать новую функцию в db > repository > blog.py.

db > repository > blog.py
db > repository > blog.py

Обратите внимание на использование .first() . Если мы напишем

blog_in_db = db.query(Blog).filter(Blog.id == id).first()

Тогда мы получим реальный объект блога из базы данных. Для этого объекта блога не определен метод delete(). Поэтому вместо этого мы работаем со ссылкой на объект блога и удаляем ее.

✅ Так, вроде основные роуты разобрали. В следующей статье поговорим о тестировании приложения.

Читайте также: Часть 11(Модульное тестирование)

.

❤️ Если вам понравилась статья, ставьте лайк и подписывайтесь на мой канал (Заходи в Ай-Ти).

👍 Если у вас остались вопросы или есть интересные темы, которые вы хотите, чтобы я разобрал, то пишите в комментариях. Ваше мнение очень важно для меня!

#fastapi #fastapi python #fastapi sqlalchemy #fastapi pydantic