Отправка сообщений на все устройства пользователя с помощью каналов 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. Я прав?