Проекты Услуги Обо мне AI Сервисы Блог Контакт
Главная Блог Статья

Как я построил аукцион для антиквариата на Django с WebSocket

10.02.2026
Django WebSocket разработка кейс

Art-auc.ru — мой проект онлайн-аукциона антиквариата и искусства. Построен на Django с WebSocket для ставок в реальном времени. Вот технический разбор.

Иллюстрация: online auction platform antique art digital
Иллюстрация: online auction platform antique art digital

Зачем WebSocket

Аукцион требует мгновенной синхронизации: когда один пользователь делает ставку, все остальные должны увидеть это в ту же секунду. HTTP-поллинг — слишком медленно и расточительно. WebSocket через Django Channels решает это элегантно.

Иллюстрация: online auction platform antique art digital
Иллюстрация: online auction platform antique art digital

Архитектура

Django Channels + Daphne (ASGI-сервер) + Redis (channel layer). Каждый лот — отдельная WebSocket-группа. Когда приходит ставка: валидация → сохранение в БД → broadcast всем подключённым к лоту.

Иллюстрация: online auction platform antique art digital
Иллюстрация: online auction platform antique art digital

Таймер аукциона

JavaScript-таймер синхронизируется с сервером. При новой ставке в последние 30 секунд — автоматическое продление. Это предотвращает «снайперские ставки» в последнюю секунду.

Иллюстрация: online auction platform antique art digital
Иллюстрация: online auction platform antique art digital

Уведомления

Email-уведомления через Celery: перебит, выиграл, проиграл, скоро завершение. Celery Beat для периодических задач: генерация статей, проверка завершённых аукционов.

Иллюстрация: online auction platform antique art digital
Иллюстрация: online auction platform antique art digital

Что узнал

  • WebSocket + Django — мощная связка, но требует Daphne/Uvicorn вместо Gunicorn
  • Redis надёжен как channel layer
  • Таймеры на клиенте нужно синхронизировать с сервером каждые 30 секунд
  • Locale-зависимые числа (запятая vs точка) ломают JavaScript — всегда форматируйте явно

Смотрите все проекты в мои проекты. Нужен подобный проект? напишите мне.

Техническая архитектура

Backend: Django 5.0 + Channels 4.x. ASGI: Daphne. Channel Layer: Redis. БД: PostgreSQL 16 + pgBouncer.

WebSocket: Каждый лот — группа lot_{id}. При ставке: receive() → валидация → Bid.objects.create()group_send() → UI обновляется без перезагрузки.

Антиснайпинг: Ставка в последние 30 секунд → автоматическое продление на 30 секунд.

Проблемы и решения

Race conditions: Два пользователя ставят одновременно. Решение: select_for_update() + atomic transaction.

Locale: Русская локаль форматирует 1500,00 — ломает JS. Решение: |stringformat:"g".

Reconnection: Мобильные теряют соединение. Решение: heartbeat + автоматический reconnect с exponential backoff.

Email-уведомления: Через Celery: перебили, выиграли, скоро завершение. Celery Beat для периодических задач.