如何使用django-channels 2.0发送用户通知?

fcg9iug3  于 2023-08-08  发布在  Go
关注(0)|答案(4)|浏览(131)

我正在开发一个有房间的聊天应用程序。每个房间有两个用户。用户可以在多个房间中,即,用户具有多个房间。现在他在一个房间里聊天。但他在另一个房间收到了一条信息。我想把其他房间的留言通知给用户。我应该如何实现这一点?
当前WebSocket连接的建立方式为:第一个月
group_name命名为"room"+room_id。到目前为止,我有:

async def connect(self):
    room_id = self.scope['url_route']['kwargs']['room_id']
    await self.channel_layer.group_add(
            "room"+room_id,
            self.channel_name
        )
    await self.accept()

async def receive(self, text_data):
    await self.channel_layer.group_send(
        self.room_name,
        {
            'type': 'chat_message',
            'message': json.loads(text_data)
        }
    )
async def chat_message(self, event):
    await self.send(text_data=json.dumps({
        'message': event['message']
    }))

字符串
Django 2.x django-channels 2.x python 3.6

z4bn682m

z4bn682m1#

您至少需要两个型号MessageMessageThread。当用户连接到套接字时,该通道将添加到包含该用户的每个线程组。您还必须将channel_name添加到用户会话中。

messaging/models.py

class MessageThread(models.Model):
    title = models.CharField()
    clients = models.ManyToManyField(User, blank=True)

class Message(models.Model):
    date = models.DateField()
    text = models.CharField()
    thread = models.ForeignKey('messaging.MessageThread', on_delete=models.CASCADE)
    sender = models.ForeignKey(User, on_delete=models.SET_NULL)

chat/consumers.py

class ChatConsumer(WebSocketConsumer):
    def connect(self):
        if self.scope['user'].is_authenticated:
            self.accept()
            # add connection to existing groups
            for thread in MessageThread.objects.filter(clients=self.scope['user']).values('id'):
                async_to_sync(self.channel_layer.group_add)(thread.id, self.channel_name)
            # store client channel name in the user session
            self.scope['session']['channel_name'] = self.channel_name
            self.scope['session'].save()

    def disconnect(self, close_code):
        # remove channel name from session
        if self.scope['user'].is_authenticated:
            if 'channel_name' in self.scope['session']:
                del self.scope['session']['channel_name']
                self.scope['session'].save()
            async_to_sync(self.channel_layer.group_discard)(self.scope['user'].id, self.channel_name)

字符串

k3fezbri

k3fezbri2#

我做了类似的事情,你可以试试这样的:

connect(message):
    // however you get your chatroom value from the socket
    Group("%s" % chatroom).add(message.reply_channel)

message(message):
    message = json.loads(message.content['text'])
    chatroom = message['chatroom']  
    Group("%s" % chatroom).send({
            "text": json.dumps({
                "id": "newuser",
                "username": message['username'],
                "message": message['message']
            })
        })

字符串
我可能误解了你的问题。也许更像是:
为每个用户创建一个唯一的id,并使用该值作为“聊天室”,然后发送每个消息,其中包含聊天室编号和它应该发送的用户编号。Django可以解释用户id并将消息发送到正确的通道,然后让JavaScript解释消息和房间号,将它们带到正确的页面?
这是个有趣的想法

ukxgm1gy

ukxgm1gy3#

(idea:)我打开了两个套接字:
1.一个用于用户正在其中发短信的当前房间
1.第二个为聊天室列表(一个隐藏的基础聊天室创建以及;最好说:属于聊天室列表的频道层),
然后,在第一个解释的通道(上面)中从任何用户收到的每个消息上,我将向两个套接字发送正确的回复。
示例在这里:chatroom.subtionary.com(只需点击一个聊天室,然后用电子邮件进入)它也重新排序聊天室列表和脉冲元素,也写下每个聊天室的最后一条消息在其元素下,也享受回复和删除选项!!
(我知道这是最懒的方法,但效果很好)

5tmbdcev

5tmbdcev4#

django代码的通告和通知系统使用基于类和使用串行化函数与孔项目代码在一步一步

相关问题