【问题标题】:Channel not sending message to partners browser频道未向合作伙伴浏览器发送消息
【发布时间】:2020-09-19 05:30:32
【问题描述】:

我正在尝试将聊天数据发送到我的浏览器。 websocket 正在向消息所有者的浏览器发送数据。但问题是消息没有从其他用户的浏览器更新。


class ChatConsumer(WebsocketConsumer):
    def connect(self):
        if(not self.scope['user'] is User):
            my_id = self.scope['user']
            self.me = User.objects.get(id=my_id)
        else:
            self.me = self.scope['user']

        others_id = self.scope['url_route']['kwargs']['user_id']
        other_user = User.objects.get(id=others_id)
        self.thread_obj = Thread.objects.get_or_create_personal_thread(
            self.me, other_user)

        self.room_name = f'presonal_thread_{self.thread_obj.id}'

        self.channel_layer.group_add(
            self.room_name,
            self.channel_name)

        self.accept()
        print(f'[{self.channel_name}] - {self.me.username} You are connected')

    def fetch_messages(self, data):
        messages = Message.objects.filter(thread=self.thread_obj)
        content = {
            'command': 'messages',
            'messages': self.messages_to_json(messages)
        }
        self.send_message(content)

    def new_message(self, data):
        message = Message.objects.create(sender=self.me,
                                         thread=self.thread_obj,
                                         message=data['message'])
        content = {
            'command': 'new_message',
            'message': self.message_to_json(message)
        }
        return self.chat_message(content)

    def messages_to_json(self, messages):
        result = []
        for message in messages:
            result.append(self.message_to_json(message))
        return result

    def message_to_json(self, message):
        return {
            'id': message.id,
            'sender_id': message.sender.id,
            'sender': message.sender.username,
            'content': message.message,
            'timestamp': str(message.posted_on)
        }

    commands = {
        'fetch_messages': fetch_messages,
        'new_message': new_message
    }

    def disconnect(self, close_code):
        self.channel_layer.group_discard(
            self.room_name,
            self.channel_name
        )

    def receive(self, text_data):
        data = json.loads(text_data)
        self.commands[data['command']](self, data)

    def chat_message(self, message):
        print(message)

        async_to_sync(self.channel_layer.group_send)(
            self.room_name,
            {
                'type': 'chat_message',
                'message': message
            }
        )
        self.send(text_data=json.dumps(message))

    def send_message(self, message):
        self.send(text_data=json.dumps(message))

当我从浏览器向频道套接字发送聊天消息时,它只会更新到我的浏览器。但不会使用新消息更新其他用户的浏览器。

注意:我是 django 频道的新手。

【问题讨论】:

    标签: python django django-channels


    【解决方案1】:

    您可以将“发送到组”移动到接收方法。您从前端发送的消息应该直接进入接收方法。

    def receive(self, text_data):
            text_data_json = json.loads(text_data)
            message = text_data_json['message']
    
            # Send message to room group
            async_to_sync(self.channel_layer.group_send)(
                self.room_group_name,
                {
                    'type': 'chat_message',
                    'message': message
                }
            )
    

    【讨论】:

    • 这真的帮了很多忙……谢谢好友。
    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 2021-03-24
    • 2013-04-02
    • 2013-07-24
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多