/task-backend--example

Repository with an illustration of one of the solutions to the task for the Backend developer of the IT School.

Primary LanguagePythonMIT LicenseMIT

👀 task-backend--example

Репозиторий с иллюстрации одного из решений задания для Backend-разработчика Школы IT.

Информация об оформлении коммитов
  • feat: (новая функционал кода, БЕЗ учёта функционала для сборок)
  • devops: (функционал для сборки, - добавление, удаление и исправление)
  • fix: (исправление ошибок функционального кода)
  • docs: (изменения в документации)
  • style: (форматирование, отсутствующие точки с запятой и т.п., без изменения производственного кода)
  • refactor: (рефакторинг производственного кода, например, переименование переменной)
  • test: (добавление недостающих тестов, рефакторинг тестов; без изменения производственного кода)
  • chore: (обновление рутинных задач и т. д.; без изменения производственного кода).
Текст задания

Реализовать RESTFull API сервис, с 3-мя эндпоинтами (Стек: Python, FastApi, PostgreSQL, pydantic). Требуется:

  • Получение всех строк из бд.
  • Отдает данные из БД, с возможностью фильтрации по полу, с заданным LIMIT.
  • Принимает JSON{id, name, gender}, парсит данные и сохраняет в бд. Необходимо валидировать данные (по типу).

Cтолбцы в базе данных: id, name(str), gender(str). БД заполнить случайными данными.

Комментарии к реализации
  1. Решил использовать ORM sqlalchemy (предварительно уточнив у инициатора задания возможность её использования), — удобно работать с простыми запросами и легко настроить подключения к БД. Можно было бы напрямую работать с psycopg2.pool, но посчитал это более сложным решением.
  2. Решил не использовать инструменты для работы с миграциями (alembic), — для задачи нет необходимости хранить изменения по структуре БД.
  3. Структуру проекта выбрал следующую:
fastapi-project
├── docker # директория с докерфайлами для docker-compose.yml
├── scripts # директория со скриптами для тестов или sql скриптами
├── src # директория для кода
│   ├── user # какой-либо функциональный блок (далее ФБ) 
│   │   ├── models.py  # модели для базы данных
│   │   ├── routers.py # обработчики (эндпоинты) путей для ФБ
│   │   ├── schemas.py  # схемы (модели) pydantic для ФБ
│   │   ├── services.py  # бизнес логика ФБ
│   │   ├── models.py  # модели ФБ для базы данных
│   │   └── types.py # типы используемые в ФБ
│   ├── config.py  # глобальный конфиг
│   ├── database.py  # вещи, связанные с подключением к БД
│   └── main.py # основной файл запуска приложения
├── .env # файл кредов (с секретами) 
├── .env.example # файл с примером кредов 
├── .gitignore
└── docker-compose.yml

Посчитал довольно гибкой для малых и средних проектов.

  1. Создание таблиц в БД обеспечивается за счёт вызова функции init_models при запуске приложения.
  2. Для взаимодействия с БД решил использовать синхронную сессию, — требований по асинхронной работе не предъявлялось (действовал по принципу KISS).
  3. Заполнение БД решил сделать с помощью отдельного скрипта через пакет Faker (скрипт самый простой и без дополнительных проверок). Скрипт можно запускать после того как структура таблиц была инициализирована (в коде делается автоматически при первом запуске)
  4. Полноценную обработку ошибок не стал ставить, — это сделано для простоты (по заданию не требовалось).
  5. Полноценную сборку докера также нет необходимости приводить, — реализовал только поднятие БД postgresql.

Installation

  1. Клонировать репозиторий проекта и зайти в директорию проекта.
  2. Создать для проекта виртуальное окружение (через pip или poetry).
  3. Переименовать файл .env.example в файл .env и настроить его под БД. Если не хочется вручную создавать соединение для БД, можно воспользоваться docker-compose.yml. Для запуска в фоновом режиме необходимо ввести команду:
    docker-compose up --build --remove-orphans -d
  4. Для запуска приложения можно запустить файл main.py или воспользоваться uvicorn:
    uvicorn src.main:app --reload
  5. Для заполнения БД можно (ПОСЛЕ ПЕРВОГО ЗАПУСКА ПРИЛОЖЕНИЯ) воспользоваться скриптом scripts/fill_db.py.

P.S. Simplicity is the ultimate sophistication.