- ✏️ Описание проекта
- 🛠 Особенности проекта
- ⚙ Описание функциональных возможностей
- 📚 Используемые технологии
- 📲 Установка и запуск
- 📗 Документация API
- 🔐 Лицензия
- 🧙♂️ Авторы
Проект на Django REST Framework + Websockets, предназначенный для общения пользователей в чатах
Демо видео: реализация back + front
Проект был разработан с целью изучения протокола Websocket на Python:
- создание подключений
- прием и обработка сообщений от клиента
- отправка сообщений клиентам
- объединение клиентов в общие группы
- взаимодействие между сокетами
В проекте реализованы следующие функциональные возможности:
REST API
- Users
- регистация
- JWT аутентификация
- информация о пользователе
- Chats
- Список чатов
- Сообщения выбранного чата
Websockets
- Список чатов пользователя, в котором:
- количество непрочитанных сообщений
- сортировка по дате последнего сообщения
- отправка обновлений клиенту при получении, прочтении, отправке сообщений в чатах
- Подписка на уведомления о новых сообщениях из активных чатов
- Чат:
- получение истории сообщений
- получение новых сообщений
- отправка сообщений
Проект был реализован в целях изучения протокола Websocket, ввиду этого была упрощена бизнес-логика взаимодействия:
- информация об активных пользователях хранится в виде множества
- непрочитанные сообщения определяются по разности времени сообщения в чате и времени последнего посещения чата пользователем
- аутентификация реализона путем передачи параметра в URL
- сериализация данных осуществляется с помощью фреймворка DRF
chat.consumers.chats.MeChatsConsumer
✅ Подключение
- Клиент производит попытку подключения, передавая JWT токен в параметре
token
/ws/me/chats/?token=<token>
- Проверка валидности токена
- Установка соединения
- Добавление клиента в список активных пользователей
- Отправка клиенту сообщения со списком чатов, в которых он участвует.
- Сортировка по дате последнего сообщения в чате в порядке убывания
- Количество непрочитанных сообщений расчитывается на основе последнего посещения чата
[
{
"chat_id": 1,
"name": "Chat name",
"unread_messages": 15
}
]
⬇️ Триггеры обновления информации о чатах
- В чате, в котором участвует пользователь, появилось новое сообщение
- Пользователь открыл чат (обновляется количество непрочитанных сообщений)
❌ Разрыв соединения
- Клиент исключается из списка активных пользователей
chat.cosumers.chats.MeChatNotificationsConsumer
✅ Подключение
- Авторизация клиента по JWT токену и установка подключения
/ws/me/chats/notifications/?token=<token>
⬇️ Отправка сообщения клиенту
При появлении нового сообщения в чате, в котором участвует пользователь отправляется сообщение в формате
{
"chat_id": 1,
"name": "Test chat",
"sender": "Ivan Ivanov"
}
chat.cosumers.chats.ChatConsumer
✅ Подключение
- Авторизация клиента по JWT токену и установка подключения. В качестве
room_name
передается ID чата.
/ws/chat/(?P<room_name>\w+)/?token=<token>
- Обновление информации о последнем посещении чата пользователем
- Отправка клиенту списка последних сообщений в чате
[
{
"id": 1,
"sender": {
"id": 2,
"username": "test",
"full_name": "test",
"email": ""
},
"is_message_mine": false,
"text": "хай",
"timestamp": "2023-11-13T12:50:52.715202+03:00"
},
{
"id": 3,
"sender": {
"id": 1,
"username": "admin",
"full_name": "admin@admin.ru",
"email": "admin@admin.ru"
},
"is_message_mine": false,
"text": "Привет",
"timestamp": "2023-11-13T12:53:28.034894+03:00"
}
]
- Обновление списка диалогов клиента (отправка сообщения в соответсвующий сокет)
⬆️ Отправка сообщения в чат
- Отправляется сообщение в формате
{
"message": "Root message"
}
- Сервер сохраняет сообщение в БД
- Отправляет сообщение всем пользователм в комнате сообщение в формате
{
"id": 3,
"sender": {
"id": 1,
"username": "admin",
"full_name": "admin@admin.ru",
"email": "admin@admin.ru"
},
"is_message_mine": false,
"text": "Привет",
"timestamp": "2023-11-13T12:53:28.034894+03:00"
}
- Отправляет уведомление о новом сообщении всем активным пользователям, кроме отправителя (отправка сообщения в соотвествующее подключение)
- Обновляет список диалогов активным пользователей (отправка сообщения в соотвествующее подключение)
Python 3.11
Djnago 4.2.7
Django REST Framework 3.14.0
PostgreSQL 14
redis 5.0
-
Клонирование репозитория:
git clone [URL-репозитория]
-
Создание
.env
на основеexample.env
:docker-compose up -d --build
-
Билд проекта:
docker-compose up -d --build
-
Создание миграций:
docker exec web python manage.py makemigrations
-
Применение миграций:
docker exec web python manage.py migrate
Документация по API доступна по /api
.
Подробности см. в файле LICENSE.
- Маршанский Николай