使用频道2向一个用户发送通知

时间:2019-03-23 04:52:13

标签: python django python-3.x websocket django-channels

我想使用频道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 个答案:

答案 0 :(得分:1)

Django频道2.x的大多数新用户都遇到此问题。让我解释一下。

$('#locationSelect').selectpicker('val', Cookies.get('location'));接受两个参数: room_name channel_name

从浏览器通过self.channel_layer.group_add("gossip", self.channel_name)连接到该使用者时,您将创建一个名为socket的新套接字连接。因此,当您在浏览器中打开多个页面时,会创建多个通道。每个频道都有唯一的ID /名称: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 )发送/广播消息时,该消息只会被该用户接收。