отправка уведомления одному пользователю по каналам 2 - PullRequest
0 голосов
/ 23 марта 2019

Я хочу отправить уведомление определенному аутентифицированному пользователю, используя каналы 2.

В приведенном ниже коде я отправляю уведомление в виде широковещательной рассылки, а не хочу отправлять уведомление конкретному пользователю.

from channels.generic.websocket import AsyncJsonWebsocketConsumer


class NotifyConsumer(AsyncJsonWebsocketConsumer):

    async def connect(self):
        await self.accept()
        await self.channel_layer.group_add("gossip", self.channel_name)
        print(f"Added {self.channel_name} channel to gossip")

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard("gossip", self.channel_name)
        print(f"Removed {self.channel_name} channel to gossip")

    async def user_gossip(self, event):
        await self.send_json(event)
        print(f"Got message {event} at {self.channel_name}")

1 Ответ

1 голос
/ 23 марта 2019

Большинство пользователей, впервые знакомых с Django-channel 2.x, сталкиваются с этой проблемой.позвольте мне объяснить.

<b>self.channel_layer.group_add("gossip", self.channel_name)</b> принимает два аргумента: имя_команды и имя_канала

Когда вы подключаетесь из браузера через socket к этомупотребитель, вы создаете новое сокетное соединение с именем <b>channel</b>.Таким образом, когда вы открываете несколько страниц в браузере, создается несколько каналов.Каждый канал имеет уникальный идентификатор / имя: <b>channel_name</b>

<b>room</b> - это группа каналов.Если кто-то отправит сообщение на <b>room</b>, все каналы в этом <b>room</b> получат это сообщение.

Итак, если вам нужно отправить уведомление / сообщение одному пользователю, вы должны создать<b>room</b> только для этого конкретного пользователя.

Предполагая, что текущий user передается в scope.

<b>self.user = self.scope["user"]
self.user_room_name = "notif_room_for_user_"+str(self.user.id) ##Notification room name
await self.channel_layer.group_add(
       self.user_room_name,
       self.channel_name
    )</b>

Всякий раз, когда вы отправляете / транслируете сообщение на user_room_name, Он будет получен только этим пользователем.

...