首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用django-channels 2.0发送用户通知?

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

Stack Overflow用户
提问于 2018-07-31 01:21:53
回答 3查看 3.3K关注 0票数 1

我正在开发一个有房间的聊天应用程序。每个房间有两个用户。一个用户可以在多个房间中,即一个用户有多个房间。现在他正在一个房间里聊天。但他在另一个房间里收到了一条信息。我想把其他房间的消息通知给用户。我应该如何实现它?

目前建立的websocket连接是:ws://localhost:8000/chat/int<room_id>/

并将group_name命名为"room"+room_id。到目前为止,我做到了:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

发布于 2018-08-02 21:11:33

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

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2018-08-01 04:18:48

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

代码语言:javascript
复制
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解释消息和房间号以将它们带到正确的页面?

这是一个有趣的想法

票数 0
EN

Stack Overflow用户

发布于 2019-09-11 13:32:15

(想法:)我打开了两个套接字:

  1. 用于当前聊天室的用户正在
  2. 中发送文本的聊天室列表的第二个聊天室(也创建了一个隐藏的基础聊天室;更准确地说是:属于聊天室列表的通道层),

然后,对于从第一个解释的通道(上面)中的任何用户收到的每条消息,我都会向这两个套接字发送适当的回复。

示例在这里:chatroom.subtionary.com (只需点击一个聊天室并通过电子邮件进入)它还可以重新排序聊天室列表和脉冲元素,还可以在元素下写入每个聊天室的最后一条消息,还可以享受回复和删除选项!!

(我知道这是最懒惰的方法,但效果很好)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51599270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档