Разработка проекта на FastAPI: от идеи до реализаци

5-10 мин

Введение

Этот проект был создан в учебных целях и стал для меня отличной возможностью глубоко изучить FastAPI. Я стремился не просто повторять чужие примеры, а создать что-то своё, отталкиваясь от изученного материала. Основная задача состояла в том, чтобы понять и использовать максимальное количество возможностей FastAPI, поэтому проект постоянно эволюционировал и продолжает совершенствоваться.

Идея и постановка задачи

С самого начала я решил, что не буду останавливаться на простых примерах и шаблонах. После изучения основ и ознакомления с лучшими практиками FastAPI (например, tutorials и advanced guides), я понял, что для полного понимания мне нужно разработать свой проект, в котором я смогу реализовать максимальный функционал, включая продвинутые возможности фреймворка. Это решение и привело к созданию пяти версий проекта, каждая из которых вносила значительные изменения.

Эволюция проекта: от простого к сложному

  1. Первая итерация: минимализм и основные CRUD операции
    • В первом варианте проекта я сосредоточился на создании минимального функционала CRUD операций для блога. Это была базовая реализация, не использующая шаблоны, с кодом, который, признаться, был далёк от идеала. Этот этап стал важным для понимания основ FastAPI и того, как взаимодействовать с его базовыми функциями. Код был “топорным”, и мне приходилось часто прибегать к копированию и вставке повторяющихся частей.
  2. Вторая итерация: усложнение и первые проблемы
    • Во второй версии я попытался усложнить проект, добавив больше функциональности и структурированных данных. Однако, с ростом функционала возникли проблемы: структура стала столь запутанной, что я сам терялся в собственных папках и файлах. В этот момент я начал понимать важность хорошей архитектуры и организации кода. Также в этой версии я впервые попробовал автоматизировать создание CRUD операций и роутеров для API. Прототип имел множество проблем, но в конце концов был вполне себе работоспособным даже для m:1, m2m связей. 
  3. Третья итерация: улучшение структуры и переход на async
    • После анализа ошибок предыдущих версий, я сосредоточился на улучшении структуры проекта. К этому времени я уже был знаком с лучшими практиками создания FastAPI проектов, но мой многолетний опыт разработки на Django оставил значительный след, что позволило мне реорганизовать код и сделать его более удобным для работы. Также в этот момент я внедрил модуль авторизации через JWT, хранящийся в cookie, и начал переход на асинхронные функции, что значительно улучшило производительность приложения.
  4. Четвертая итерация: создание шаблонного CRUD и работа с файлами
    • Четвёртая версия проекта была посвящена завершению работы над async CRUDBase и CRUDRouter. За основу я брал под изучение такие проекты как fastapi-crudrouter и FastAPI admin. Здесь я стремился создать что-то, напоминающее CBV (class-based views) из Django, чтобы обеспечить удобное создание моделей для базы данных, схем pydantic, и роутеров для API. Для всех CRUD была добавлена возможность автоматической работы с файлами (их можно грузить через admin и API просто определяя соответствующие схемы для БД (orm) и для API (pydantic)). В результате мне удалось разработать шаблонную систему, которая позволяет легко переопределять стандартные CRUD операции и дописывать в сервис работы с БД любые нетиповые запросы. 
  5. Пятая итерация: подготовка к продакшену
    • Финальная версия перед релизом была сосредоточена на переходе к продакшену. Я заменил тестовую SQLite на PostgreSQL, добавил BaseSettings для управления конфигурацией, и реализовал модуль создания проектов, который позволяет хранить их в базе данных. Также была внедрена мультиязычность (ru, en), добавлены middlewares для контроля доступа и страница авторизации. Этот этап был важен для того, чтобы подготовить проект к реальной эксплуатации.

Итог и выводы

Этот проект стал для меня не только отличной возможностью изучить FastAPI, но и глубже понять, как строить архитектуру приложений. Каждый этап разработки приносил новые вызовы и уроки, а итоговый результат стал базой для дальнейшего роста и совершенствования. Проект был реализован на шаблонах Jinja2, поскольку я решил сосредоточиться на backend разработке, однако в будущем возможна его доработка и расширение в направлении frontend.