отправка уведомления одному пользователю с использованием каналов 2

#python #django #python-3.x #websocket #django-channels

#python #django #python-3.x #websocket #django-каналы

Вопрос:

Я хочу отправить уведомление конкретному аутентифицированному пользователю с использованием каналов 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:

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

self.channel_layer.group_add("gossip", self.channel_name) принимает два аргумента: room_name и channel_name

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

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

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

Предполагая, что ток user передается в пользовательском scope .

 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
    )  

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

Комментарии:

1. привет. Как я могу отправить широковещательное сообщение user_room_name извне класса, скажем, a view ? Спасибо