Проект выполнен в рамках интенсива от Y_Lab. Проходил в июле-августе 2023г. Состоял из 4-х заданий.
ЗАДАНИЯ:
-
Написать проект на FastAPI с использованием PostgreSQL в качестве БД. В проекте следует реализовать REST API по работе с меню ресторана, все CRUD операции. Даны 3 сущности: Меню, Подменю, Блюдо.
Зависимости:
- У меню есть подменю, которые к ней привязаны.
- У подменю есть блюда.
Условия:
- Блюдо не может быть привязано напрямую к меню, минуя подменю.
- Блюдо не может находиться в 2-х подменю одновременно.
- Подменю не может находиться в 2-х меню одновременно.
- Если удалить меню, должны удалиться все подменю и блюда этого меню.
- Если удалить подменю, должны удалиться все блюда этого подменю.
- Цены блюд выводить с округлением до 2 знаков после запятой.
- Во время выдачи списка меню, для каждого меню добавлять кол-во подменю и блюд в этом меню.
- Во время выдачи списка подменю, для каждого подменю добавлять кол-во блюд в этом подменю.
-
В этом домашнем задании необходимо:
Обернуть программные компоненты в контейнеры. Контейнеры должны запускаться по одной команде “docker-compose up -d” или той которая описана вами в readme.md.
Образы для Docker:
-
(API) python:3.10-slim
-
(DB) postgres:15.1-alpine
-
Написать CRUD тесты для ранее разработанного API с помощью библиотеки pytest
-
Подготовить отдельный контейнер для запуска тестов. Команду для запуска указать в README.md
-
-
В этом домашнем задании необходимо:
- Вынести бизнес логику и запросы в БД в отдельные слои приложения.
- Добавить кэширование запросов к API с использованием Redis. Не забыть про инвалидацию кэша.
- Добавить pre-commit хуки в проект.
- Покрыть проект type hints (тайпхинтами)
- Описать ручки API в соответствий c OpenAPI
- Реализовать в тестах аналог Django reverse() для FastAPI
Дополнительно:
- Контейнеры с проектом и с тестами запускаются разными командами.
-
В этом домашнем задании необходимо:
- Переписать текущее FastAPI приложение на асинхронное выполнение
- Добавить в проект фоновую задачу с помощью Celery + RabbitMQ.
- Добавить эндпоинт (GET) для вывода всех меню со всеми связанными подменю и со всеми связанными блюдами.
- Реализовать инвалидация кэша в background task (встроено в FastAPI)
- Блюда по акции. Размер скидки (%) указывается в столбце G файла Menu.xlsx
Фоновая задача:
Синхронизация Excel документа и БД. В проекте создаем папку admin. В эту папку кладем файл Menu.xlsx (будет прикреплен к ДЗ). При внесении изменений в файл все изменения должны отображаться в БД. Периодичность обновления 15 сек. Удалять БД при каждом обновлении – нельзя.
-
Клонировать репозиторий
git clone <ссылка с git-hub>
-
Перейти в папку /YLab_Fastapi_project
-
Требуется файл .env - пример в репозитории. Для пробного запуска можно использовать приложенный пример.
-
Поднять контейнеры в фоновом режиме
docker compose up -d
-
Чтобы прекратить работу контейнеров воспользуйтесь командой
docker compose down
Если хотите прекратить работу контейнеров с удалением томов (рекомендуется), то дополните команду флагом -v
docker compose down -v
-
Документация доступна по адресу http://127.0.0.1:8000/docs
Для прогона написанных мной тестов подготовлен отдельный вариант файла docker compose. Сценарий тестирования предполагает старт контейнеров, вывод результатов прохождения тестов на экран и удаление контейнеров вместе с томами.
Если проект был запущен локально раньше, то для стабильного запуска по данной инструкции необходимо остановить ранее запущенный сервис, удалить контейнеры, тома и образы, которые использовались для него.
Требуется файл .env_test - пример в репозитории. Для пробного запуска можно использовать приложенный пример. Переменная CELERY_STATUS должна быть в положении "false".
-
Для запуска сценария необходимо после клонирования репозитория выполнить в папке /YLab_Fastapi_project следующую команду
docker compose -f docker-compose-pytest.yml up -d && docker logs --follow backend && docker compose -f docker-compose-pytest.yml down -v
telegram @Menshikov_AS
e-mail [email protected]