Приложение-чат на Python, построенное с использованием принципов Domain-Driven Design (DDD), FastAPI и MongoDB.
- DDD архитектура - Чистая архитектура с разделением на слои
- FastAPI - Современный асинхронный веб-фреймворк
- MongoDB - NoSQL база данных с async драйвером Motor
- Docker & Docker Compose - Контейнеризированная среда разработки
- Poetry - Современное управление зависимостями Python
- Pre-commit хуки - Автоматическая проверка кода перед коммитом
- Pytest - Фреймворк для тестирования
Перед началом работы убедитесь, что у вас установлено:
-
Клонируйте репозиторий
git clone <repository-url> cd ddd-kafka-python
-
Настройте переменные окружения
cp .env.example .env # Отредактируйте файл .env с вашими настройками -
Запустите приложение
make app
-
Просмотр логов
make app-logs
-
Установите зависимости
poetry install
-
Настройте интерпретатор Python в IDE
# Получите путь к виртуальному окружению poetry env activateЗатем в VS Code:
- Нажмите
Ctrl + Shift + P(илиCmd + Shift + Pна macOS) - Выберите
Python: Select Interpreter - Выберите
Enter interpreter path... - Скопируйте путь из команды выше и добавьте
/bin/python3в конце
Например:
/Users/user/Library/Caches/pypoetry/virtualenvs/ddd-kafka-python-xxx/bin/python3 - Нажмите
-
Установите pre-commit хуки
pre-commit install
-
Запустите сервер разработки
uvicorn app.application.api.main:create_app --factory --reload
Проект включает Makefile для упрощения работы с Docker:
make app # Запустить приложение
make app-down # Остановить приложение
make app-logs # Просмотреть логи приложения
make app-shell # Подключиться к контейнеру
make precommit # Запустить pre-commit проверкиddd-kafka-python/
├── app/ # Основной код приложения
│ ├── application/ # Слой приложения
│ │ ├── api/ # API эндпоинты
│ │ │ ├── main.py # Инициализация FastAPI
│ │ │ └── messages/ # Эндпоинты для сообщений
│ │ └── __init__.py
│ ├── domain/ # Доменный слой
│ │ ├── entities/ # Доменные сущности
│ │ │ ├── base.py # Базовая сущность
│ │ │ └── messages.py # Сущности сообщений
│ │ ├── value_objects/ # Объекты-значения
│ │ │ ├── base.py
│ │ │ └── messages.py
│ │ ├── exceptions/ # Доменные исключения
│ │ │ ├── base.py
│ │ │ └── messages.py
│ │ └── __init__.py
│ ├── infra/ # Инфраструктурный слой
│ │ └── __init__.py
│ ├── logic/ # Бизнес-логика
│ │ └── __init__.py
│ └── tests/ # Тесты
│ └── domain/
│ └── test_messages.py
├── docker_compose/ # Конфигурации Docker Compose
│ └── app.yaml # Сервисы приложения
├── Dockerfile # Конфигурация Docker образа
├── Makefile # Команды для разработки
├── pyproject.toml # Конфигурация Poetry
├── poetry.lock # Зафиксированные версии зависимостей
└── README.md # Документация проекта
Проект следует принципам Domain-Driven Design:
-
Domain (Домен) - Ядро бизнес-логики
entities/- Доменные сущности с уникальными идентификаторамиvalue_objects/- Неизменяемые объекты-значенияexceptions/- Доменные исключения
-
Application (Приложение) - Слой координации
api/- REST API эндпоинты- Оркестрация use cases
-
Infrastructure (Инфраструктура) - Технические детали
- Репозитории
- Внешние сервисы
- База данных
-
Logic (Логика) - Бизнес-логика и use cases
MessageEntity - Сообщение в чате
@dataclass
class MessageEntity(BaseEntity):
text: TextValueObjectChatEntity - Чат с сообщениями
@dataclass
class ChatEntity(BaseEntity):
title: TitleValueObject
messages: list[MessageEntity]
def add_message(self, message: MessageEntity):
self.messages.append(message)Приложение использует переменные окружения для конфигурации. Создайте файл .env со следующими переменными:
# MongoDB
MONGO_HOST=mongodb
MONGO_PORT=27017
MONGO_DB=ddd_kafka_db
MONGO_USER=admin
MONGO_PASSWORD=password
# Application
APP_PORT=8000
DEBUG=TrueПроект использует pytest для тестирования:
# Запуск всех тестов
poetry run pytest
# Запуск с подробным выводом
poetry run pytest -v
# Запуск конкретного теста
poetry run pytest app/tests/domain/test_messages.pyПроект настроен с pre-commit для автоматической проверки кода:
# Установка хуков
pre-commit install
# Ручной запуск проверок
make precommitАвтоматическая сортировка импортов настроена в pyproject.toml:
- Длина строки: 120 символов
- Multi-line вывод: 3
- Алфавитная сортировка в секциях
После запуска приложения, документация API доступна по адресу:
- Swagger UI: http://localhost:8000/api/docs
- ReDoc: http://localhost:8000/redoc
- Создайте value objects в
domain/value_objects/ - Создайте сущность в
domain/entities/ - Добавьте исключения в
domain/exceptions/ - Напишите тесты в
tests/domain/ - Реализуйте use cases в
logic/ - Создайте API эндпоинты в
application/api/
from faker import Faker
from domain.entities.messages import MessageEntity
from domain.value_objects.messages import TextValueObject
def test_message_entity():
faker = Faker()
text = TextValueObject(faker.text())
message = MessageEntity(text=text)
assert message.text == textЕсли у вас возникли проблемы или вопросы:
- Проверьте документацию FastAPI
- Просмотрите логи:
make app-logs - Подключитесь к контейнеру:
make app-shell
Для обновления проекта:
-
Получите последние изменения
git pull origin master
-
Обновите зависимости
poetry update
-
Пересоберите контейнеры
make app-down make app
Удачной разработки! 🎉