YLab_Fastapi_project

Проект выполнен в рамках интенсива Python от компании Y_lab. По результатам выполнения и техсобеса принят на стажировку в компанию Y_lab

MIT License

Stars
5
Committers
2

YLab_Fastapi_project

Проект выполнен в рамках интенсива от Y_Lab. Проходил в июле-августе 2023г. Состоял из 4-х заданий.

  1. Написать проект на FastAPI с использованием PostgreSQL в качестве БД. В проекте следует реализовать REST API по работе с меню ресторана, все CRUD операции. Даны 3 сущности: Меню, Подменю, Блюдо.

    Зависимости:

    • У меню есть подменю, которые к ней привязаны.
    • У подменю есть блюда.

    Условия:

    • Блюдо не может быть привязано напрямую к меню, минуя подменю.
    • Блюдо не может находиться в 2-х подменю одновременно.
    • Подменю не может находиться в 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

  3. В этом домашнем задании необходимо:

    • Вынести бизнес логику и запросы в БД в отдельные слои приложения.
    • Добавить кэширование запросов к API с использованием Redis. Не забыть про инвалидацию кэша.
    • Добавить pre-commit хуки в проект.
    • Покрыть проект type hints (тайпхинтами)
    • Описать ручки API в соответствий c OpenAPI
    • Реализовать в тестах аналог Django reverse() для FastAPI

    Дополнительно:

    • Контейнеры с проектом и с тестами запускаются разными командами.
  4. В этом домашнем задании необходимо:

    • Переписать текущее FastAPI приложение на асинхронное выполнение
    • Добавить в проект фоновую задачу с помощью Celery + RabbitMQ.
    • Добавить эндпоинт (GET) для вывода всех меню со всеми связанными подменю и со всеми связанными блюдами.
    • Реализовать инвалидация кэша в background task (встроено в FastAPI)
    • Блюда по акции. Размер скидки (%) указывается в столбце G файла Menu.xlsx

    Фоновая задача: Синхронизация Excel документа и БД. В проекте создаем папку admin. В эту папку кладем файл Menu.xlsx (будет прикреплен к ДЗ). При внесении изменений в файл все изменения должны отображаться в БД. Периодичность обновления 15 сек. Удалять БД при каждом обновлении – нельзя.

Запуск

Запуск проекта с полным функционалом

  1. Клонировать репозиторий

    git clone <ссылка с git-hub>
    
  2. Перейти в папку /YLab_Fastapi_project

  3. Требуется файл .env - пример в репозитории. Для пробного запуска можно использовать приложенный пример.

  4. Поднять контейнеры в фоновом режиме

    docker compose up -d
    
  5. Чтобы прекратить работу контейнеров воспользуйтесь командой

    docker compose down
    

    Если хотите прекратить работу контейнеров с удалением томов (рекомендуется), то дополните команду флагом -v

    docker compose down -v
    
  6. Документация доступна по адресу http://127.0.0.1:8000/docs

Запуск проекта с прохождением тестов через pytest

Для прогона написанных мной тестов подготовлен отдельный вариант файла docker compose. Сценарий тестирования предполагает старт контейнеров, вывод результатов прохождения тестов на экран и удаление контейнеров вместе с томами.

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

Требуется файл .env_test - пример в репозитории. Для пробного запуска можно использовать приложенный пример. Переменная CELERY_STATUS должна быть в положении "false".

  1. Для запуска сценария необходимо после клонирования репозитория выполнить в папке /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]