在聊天应用程序中获取最新消息-Django

时间:2019-12-27 18:24:27

标签: javascript django websocket django-channels

我已经用Django Channels编写了一个聊天应用程序,并且运行良好。唯一的问题是获取最新消息并在返回聊天应用程序时显示它们。目前,此问题已通过在js文件的old_messages()部分中添加获取旧消息(chatSocket.onopen = function(e))的函数来解决。 现在唯一的问题是:当用户A刷新聊天页面时,另一个用户(用户B)两次收到较旧的消息((因为连接已关闭并第二次打开)由用户A )。知道如何避免此问题吗?

这是js文件的一部分:

var chatSocket = new ReconnectingWebSocket(
        'ws://' + window.location.host +
        '/ws/chat/' + discussion_slug + '/');

chatSocket.onopen = function(e) {
      console.log("open",e)
      old_messages();

    };

function old_messages() {
      chatSocket.send(JSON.stringify({'command': 'old_messages',
                                      'discussion_slug': discussion_slug }));

    };

在consumers.py中:

def old_messages(self,data):

    discussion_slug = Discussion.objects.get(slug=data['discussion_slug'])
    last_msgs = discussion_slug.messages.all()[:15]
    content = {
        'command': 'old',
        'message': self.many_msg_to_json(last_msgs)
    }
    return content


async def receive(self, text_data):
    data = json.loads(text_data)

    content = self.commands[data['command']](self,data)

    await self.channel_layer.group_send(
        self.room_group_name,
        {
            'type': 'chat_message',
            'message': content
        }
    )

谢谢!

1 个答案:

答案 0 :(得分:0)

您是否尝试过ModelName.objects.all()。reverse()?排序将是最新的,因此您可能不需要old_messages()。

如果这没有帮助,请告诉我。装好电脑后,我会更好看