Отправка сообщений на все устройства пользователя с помощью каналов django

Я занимаюсь разработкой проекта. В нем используются django channels для websockets. И я столкнулся с проблемой отправки ws-сообщений на все устройства одного и того же аккаунта, который вошел в систему. Это не редкая ситуация, когда многие пользователи используют одни и те же учетные записи, пока проект находится в разработке. Так вот, когда один пользователь заходит в систему, а другой заходит, а потом выходит, первый пользователь не получает сообщений.

Я пробовал считать устройства, но этот метод ничего не меняет.

Мой потребитель:

class NotificationConsumer(AsyncWebsocketConsumer):
    def __init__(self, *args, **kwargs):
        super().__init__(args, kwargs)
        self.user = None
        self.pool_name = None

    async def connect(self):
        self.user = self.scope["user"]
        self.pool_name = f"user_id_{self.scope['url_route']['kwargs']['user_id']}"
        await self.accept()

        # Join pool
        created = await self.add_online_user()
        if created:
            await self.channel_layer.group_add(
                self.pool_name,
                self.channel_name,
            )

    async def disconnect(self, close_code):
        # Leave room group
        removed = await self.remove_online_user()
        if removed:
            await self.channel_layer.group_discard(self.pool_name, self.channel_name)

    # Receive message from WebSocket
    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json["message"]
        # Send message to room group
        await self.channel_layer.group_send(self.pool_name, {"type": "read_message", "message": message})

    # Receive message from room group
    async def notification_message(self, event):
        message = event["message"]
        await self.send(text_data=json.dumps({"message": [message]}, ensure_ascii=False))

    @database_sync_to_async
    def add_online_user(self):
        online_user = OnlineUser.objects.filter(user=self.user).first()
        if not online_user:
            OnlineUser.objects.create(user=self.user, counter=1)
            return True
        else:
            if online_user.counter:
                online_user.counter += 1
            else:
                online_user.counter = 2
            online_user.save()
            return False

    @database_sync_to_async
    def remove_online_user(self):
        online_user = OnlineUser.objects.filter(user=self.user).first()
        if online_user:
            if online_user.counter:
                if online_user.counter == 1 or online_user.counter is None:
                    online_user.delete()
                    return True
                else:
                    online_user.counter -= 1
                    online_user.save()
                    return False
            else:
                online_user.delete()
                return True

Модель OnlineUser:

class OnlineUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="online_user")
    counter = models.IntegerField(null=True, blank=True)

И метод отправки сообщения

def send_messages(notifications):
    channel_layer = get_channel_layer()
    mark_as_send = []
    for notification in notifications:
        online_user = User.objects.filter(online_user__user=notification.to_user)
        if online_user.exists():
            message = NotificationSerializer(notification).data
            data = {"type": "notification_message", "message": message}
            async_to_sync(channel_layer.group_send)(f"user_id_{notification.to_user.id}", data)
            mark_as_send.append(notification.id)

В итоге я получил, что сообщение отмечено как отправленное, но не получено. И это не проблема с фронтендом, потому что я не получаю сообщение и в Postman.

только один читатель должен получать каждое написанное сообщение. -- в документации Таким образом, это не поддерживается каналами django. Я прав?

Вернуться на верх