Веб-приложение для создания и управления комментариями с возможностью сортировки по различным критериям.
- По имени пользователя (
username) - алфавитная сортировка - По email (
email) - алфавитная сортировка - По дате добавления (
timestamp) - хронологическая сортировка
- По убыванию (
desc) - от большего к меньшему - По возрастанию (
asc) - от меньшего к большему
- LIFO (Last In, First Out) - новые посты отображаются первыми
- Полнотекстовый поиск по постам и комментариям
- Elasticsearch интеграция для быстрого поиска
- Аутентификация через JWT токены
- CRUD операции для постов и пользователей
- Пагинация и фильтрация результатов
- Django 5.2.4
- GraphQL (graphene-django)
- Elasticsearch 8.11.0
- Apache Kafka 7.4.0
- Bootstrap 5.3.0
- Bootstrap Icons 1.11.0
- Python 3.11+
- SQLite 3
- Docker & Docker Compose
Перед запуском приложения создайте файл .env в корневой директории проекта со следующими переменными:
# Django
DJANGO_SECRET_KEY=your_django_secret_key_here
# Google reCAPTCHA
RECAPTCHA_PUBLIC_KEY=your_recaptcha_public_key_here
RECAPTCHA_PRIVATE_KEY=your_recaptcha_private_key_hereDJANGO_SECRET_KEY:
- Сгенерируйте новый ключ: https://djecrety.ir/
- Или используйте команду Python:
from django.core.management.utils import get_random_secret_key print(get_random_secret_key())
Google reCAPTCHA:
- Перейдите на https://www.google.com/recaptcha/admin
- Нажмите "+" для создания нового сайта
- Выберите reCAPTCHA v2 "Я не робот"
- Добавьте домены:
localhost,127.0.0.1 - Получите Site Key (публичный) и Secret Key (приватный)
- Вставьте их в
.envфайл
Просто запустите:
docker-compose up -dОткройте в браузере:
- Django: http://localhost:8000
- GraphQL Playground: http://localhost:8000/graphql/
- Elasticsearch: http://localhost:9200
- Kafka UI: http://localhost:8080
- GraphQL Playground: http://localhost:8000/graphql/
query {
allPosts {
id
text
username
email
timestamp
parentPost {
id
text
}
}
}query {
elasticsearchSearch(query: "поисковый запрос", size: 10) {
hits {
id
text
username
score
}
total
}
}mutation {
createPost(input: {
text: "Текст нового поста"
}) {
post {
id
text
username
}
success
}
}query {
allPosts {
id
text
username
email
timestamp
parentPost {
id
text
}
}
}query {
elasticsearchSearch(query: "поисковый запрос", size: 10) {
hits {
id
text
username
score
}
total
}
}mutation {
createPost(input: {
text: "Текст нового поста"
parentPostId: "1"
}) {
post {
id
text
username
}
success
}
}API использует JWT токены. Для авторизованных запросов добавьте заголовок:
Authorization: JWT <your_token>
- Django - основной веб-фреймворк
- GraphQL - API для гибкого взаимодействия с данными
- Elasticsearch - поисковая система для быстрого поиска
- Kafka - система обмена сообщениями для асинхронной обработки
- JWT - аутентификация пользователей
- Пользователь создает пост через GraphQL API
- Django сохраняет пост в базе данных
- Kafka отправляет событие о новом посте
- Elasticsearch индексирует пост для поиска
- Пост становится доступен для поиска через API
test_task_comments/
├── posts/ # Приложение для постов
│ ├── documents.py # Elasticsearch документы
│ ├── search_service.py # Поисковый сервис
│ └── signals.py # Django сигналы
├── users/ # Приложение для пользователей
├── graphql_app/ # GraphQL API
│ ├── schema.py # GraphQL схема
│ └── jwt_utils.py # JWT аутентификация
├── common/ # Общие компоненты
│ └── kafka_client.py # Kafka клиент
├── templates/ # HTML шаблоны
├── static/ # CSS, JS, изображения
├── media/ # Загружаемые файлы
└── docker-compose.yml
- django - Django приложение
- elasticsearch - Поисковая система
- kafka - Apache Kafka брокер
- zookeeper - Координатор для Kafka
- kafka-ui - Веб-интерфейс для мониторинга Kafka