1. Архитектура проекта и настройка окружения
Архитектура проекта и настройка окружения
В этом курсе мы будем собирать реальный Flask-проект так, как его обычно делают в командах: с понятной структурой, изолированным окружением, конфигурацией через переменные окружения и базовой готовностью к тестам и деплою.
Чтобы все последующие статьи были практичными, уже в самом начале договоримся о каркасе проекта и инструментах разработки.
Какой проект мы будем строить
В качестве учебного проекта возьмём небольшой веб-сервис с типичным набором требований:
Важно не то, какой именно сервис, а то, что его архитектура должна выдерживать рост: новые страницы, новые API-ручки, новые модели и интеграции.
Принципы архитектуры для Flask-проекта
Flask гибкий: можно написать всё в одном файле, и оно будет работать. Но реальный проект быстро превращается в хаос, если заранее не разделить ответственность.
Ниже принципы, на которых мы будем строить проект.
Явные границы слоёв
Мы будем разделять код на части по ответственности:
Так проще тестировать и менять реализацию (например, заменить способ хранения данных) без переписывания всего приложения.
Фабрика приложения
Фабрика приложения — это функция, которая создаёт и настраивает экземпляр Flask-приложения. Это стандартный паттерн в Flask, полезный для:
Официальный паттерн описан в документации Flask: Application Factories.
Модули через blueprints
Blueprint — механизм, который позволяет группировать маршруты по смыслу (например, auth, api, web). Это помогает держать структуру проекта чистой и масштабируемой.
Документация: Blueprints.
Конфигурация через переменные окружения
Мы будем избегать “зашитых” настроек в коде:
Документация Flask по настройкам: Configuration Handling.
!Диаграмма показывает разделение ответственности и направление зависимостей
Структура проекта
Ниже рекомендуемая структура, к которой мы будем придерживаться в курсе.
!Иллюстрация структуры проекта и расположения ключевых модулей
Рекомендуемое дерево каталогов
Что где лежит
| Часть | Зачем нужна | Типичные примеры |
|---|---|---|
| app/__init__.py | фабрика приложения, регистрация blueprint, подключение конфигурации | create_app() |
| app/config.py | классы конфигурации | DevelopmentConfig, TestingConfig |
| app/extensions.py | подключение расширений Flask в одном месте | SQLAlchemy, Migrate, LoginManager |
| app/blueprints/* | маршруты, разбитые по смыслу | auth/routes.py, api/routes.py |
| app/services/* | бизнес-логика (правила) | регистрация пользователя, выдача токена |
| app/repositories/* | работа с базой и запросами | UserRepository.get_by_email() |
| app/models/* | модели данных (ORM) | User, Session |
| tests/* | автоматические тесты | pytest |
Настройка окружения разработки
Цель: получить воспроизводимую среду, которая одинаково работает у всех (и на CI в будущем).
Версия Python
Для курса ориентируйтесь на актуальный Python 3.11+ (если у вас 3.10 — тоже подойдёт, но лучше обновиться).
Виртуальное окружение
Виртуальное окружение — это отдельная папка, куда устанавливаются зависимости проекта, чтобы они не смешивались с глобальными пакетами системы.
Официальная документация: venv — Creation of virtual environments.
Создание и активация:
Проверка:
Установка зависимостей
Мы разделим зависимости на:
requirements.txt (пример минимального набора):
requirements-dev.txt:
Установка:
Если pip для вас новый инструмент, ориентируйтесь на документацию: pip documentation.
Точка входа: фабрика приложения
Создадим минимальный каркас, чтобы приложение уже запускалось, но при этом соответствовало архитектуре.
app/__init__.py
Что здесь важно:
create_app(...) создаёт новый экземпляр Flask-приложенияconfig_object — строка с путём до класса конфигурации/health — простой эндпоинт для проверки, что сервис жив (позже будет полезно для мониторинга и контейнеров)Конфигурация проекта
Сделаем несколько конфигураций: для разработки, тестов и продакшена.
app/config.py
Пояснения:
SECRET_KEY нужен Flask для подписи некоторых данных (например, сессий). В продакшене он должен быть длинным и секретнымDEBUG включает удобный режим разработкиTESTING включает режим, полезный для тестовПеременные окружения и файл .env
Чтобы не хранить секреты в репозитории, создадим шаблон:
.env.example
Локально вы создаёте .env (его не коммитим), а в репозиторий кладём только .env.example.
Для удобной загрузки переменных окружения в разработке используем python-dotenv: python-dotenv на PyPI.
Flask автоматически подхватывает .env, если python-dotenv установлен.
Запуск приложения
В Flask 2+ рекомендуемый способ запуска через CLI.
Документация: Flask Command Line Interface.
Команда:
Проверка:
http://127.0.0.1:5000/health{"status": "ok"}Базовые инструменты качества кода
В реальных проектах важно, чтобы стиль кода и базовые ошибки ловились автоматически.
Мы возьмём три инструмента:
black — автоформатирование кода (Black documentation)ruff — быстрый линтер (ищет проблемы и стилистические ошибки) (Ruff documentation)pytest — тестирование (pytest documentation)Минимальный pyproject.toml
Обратите внимание: pyproject.toml — общий конфигурационный файл для инструментов Python. В следующих статьях мы дополним настройки.
Запуск:
Автопроверки перед коммитом
Чтобы не забывать запускать форматирование и линтер вручную, подключают pre-commit.
Сайт проекта: pre-commit.
На этом шаге достаточно понять идею: при попытке сделать коммит автоматически запускаются проверки, и плохой код не попадает в репозиторий.
Итоги
В этой статье мы:
В следующей статье мы начнём наполнять каркас функциональностью: добавим первые blueprint, нормальную структуру маршрутов и подготовим основу под базу данных и тесты.