#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
извне класса, скажем, aview
? Спасибо