Навигация по курсу:
Вспоминаем прошлые уроки
Недавно мы создали запись в таблице пользователей, поэтому у нас есть поле author_id для создания нового блога. Давайте создадим новый блог, используя запрос для создания публикаци (подобную операию мы производили в прошлой убликации). Не стесняйтесь попробовать это самостоятельно.
Нам нужны 3 новых файла:
Пилим роут для создания блога
Введите следующий код в route_blog.py:
Делаем то же самое, создаем маршрут, который будет получать данные для создания блога методом POST. Он проверит полученные данные с помощью схемы CreateBlog. Единственная загвоздка в том, что мы не будем запрашивать у пользователей пул, а создадим его на основе предоставленного заголовка. Поскольку мы хотим выполнить генерацию пула еще до того, как данные тела запроса будут проверены Pydantic, нам придется поместить ключевое слово pre=True в наш валидатор. Итак, давайте создадим необходимые схемы. Введите следующее в разделе schemas > blog.py.
Поскольку мы используем шаблон репозитория и хотим, чтобы логика базы данных или базы данных была полностью отделена от логики маршрутов fastapi, нам нужно создать новую функцию с именем «create_new_blog» для логики создания. Давайте создадим этот файл db > repository > blog.py.
Это еще один пример формы sqlalchemy. Создаем новую запись в базе данных с помощью ORM. Тем не менее, наше приложение fastapi не знает об этой новой функции. Итак, нам нужно импортировать маршрут create_blog в apis > base.py.
Создаем роут для восстановления блога
Думаю, вы еще помните самый первый пост (если не читал, тыкай сюда), где я рассказал вам разницу между запросами get, post, put, patch и delete. В этом посте мы собираемся изучить GET-запросы. Сначала мы реализуем маршрут, который возвращает данные о сообщении блога по его идентификатору. На этот раз у нас уже есть все существующие файлы. Просто добавьте следующий код в apis > v1 > route_blog.py.
Так как наша база данных и логика ORM будут находиться в папке repository. Итак, давайте добавим следующие строки в файл db > repository > blog.py:
- Этот запрос создан на базе sqlalchemy.
- Это эквивалентно: select * from blog where id = 1; # id = given_id
- База данных найдет блог и вернет результат. Мы проверяем, что этот возвращенный элемент не является пустым. В случае его отсутствия мы создаем исключение HTTPException, чтобы информировать наших пользователей о проблеме
Роут для получения списка всех блогов
В типичном представлении пользователей блог - список постов, а не одна единственная запись. Не обязательно всегда показывать полный список карточек. Это может быть список строк в таблице или даже список элементов в необработанном формате!
Вообще в любом API у нас есть 5 типов операций:
- Список
- Получить (получить одну запись из БД)
- Опубликовать (создать новую запись в БД)
- Установить/Патчить (Обновить запись)
- Удалить (Удалить запись из БД)
В этом посте мы собираемся реализовать это представление списка. Нам нужно добавить новый роут в apis > v1 > route_blog.py.
Поскольку нам не нужен какой-либо идентификатор или какие-либо данные для получения, мы просто используем сессию с бд. Обратите внимание, что мы используем внедрение зависимостей вместо жесткого кодирования базы данных. Это поможет нам переопределить db во время наших тестов. Нам нужно создать функцию list_blogs в db > repository > blog.py , которая фактически будет извлекать все блоги из базы данных и возвращать результат на наш маршрут. Наконец, мы возвращаем все блоги с маршрута клиенту/браузеру и во время этого процесса проверяем, что атрибуты фильтруются с использованием схемы ShowBlog. Поскольку на самом деле мы возвращаем список [ ] блогов схемы ShowBlog, поэтому мы использовали List[ShowBlog]. Давайте реализуем функцию list_blogs в db > repository > blog.py
Готово. Теперь все, что нам нужно, это сделать активными хотя бы 1 или 2 блога. Мы можем открыть PgAdmin, перейти к таблице с именем blog, щелкнуть ее правой кнопкой мыши, выбрать «Инструмент запросов» и выполнить приведенный ниже запрос, чтобы сделать блог активным.
Пришло время протестировать наш API с помощью документации. Перейдите к документации API (http://127.0.0.1/docs), и при нажатии кнопки «Выполнить» вы должны получить список блогов.
Создание роута для обновления блога
Мы все совершаем ошибки, поэтому сообщения в блоге также нуждаются в обновлении. Итак, сейчас мы создадим роут для обновления записи в нашей базы данных.
Для начала создадим схему. Поскольку нам нужна та же информация, что и для создания публикации в блоге, мы можем просто наследовать схему CreateBlog. Давайте сделаем это в schemas > blog.py.
Давайте реализуем новый маршрут в apis > v1 > route_blog.py.
Наш маршрутизатор принимает идентификатор ({id}) в параметре пути и проверяет, передается ли правильная схема блога в теле запроса, используя схему UpdateBlog. Этот маршрут зависит от репозитория в db > repository > blog.py.
Функция update_blog не требует пояснений (если требует, напишите в комментарии, я подробнее расскажу). Мы просто ищем, существует ли блог с данным идентификатором в базе данных. Если блог существует, мы обновляем заголовок и содержимое, используя их (они есть в теле запроса).
Создание роута для удаления блога
Точно так же, как и необходимость обновления, иногда мы пишем несколько 💩 (включая меня). В таких случаях нам необходимо удалить сообщение в блоге. Чтобы включить удаление сообщения, нам нужно будет создать маршрут и запросы ORM, поддерживающие этот маршрут. Давайте продолжим.
Нам также нужен запрос к репозиторию ORM, который поддерживает удаление объекта блога. Для этого нам нужно будет создать новую функцию в 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