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

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