【问题标题】:Get latest message in a chat application - Django在聊天应用程序中获取最新消息 - Django
【发布时间】:2020-04-17 15:42:49
【问题描述】:

我用 Django Channels 编写了一个聊天应用程序,它运行良好。唯一的问题是获取最新消息并在返回聊天应用程序时显示它们。通过在 js 文件的 chatSocket.onopen = function(e) 部分中添加一个获取旧消息 (old_messages()) 的函数,暂时解决了这个问题。 现在唯一的问题是:当用户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 }));

    };

在消费者.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
        }
    )

谢谢!

【问题讨论】:

  • 用户 B 的连接不应受到用户 A 刷新连接的影响。每个客户端都有与服务器的单独连接。所以我几乎不认为这是 B 得到重复消息的原因。可能是其他原因

标签: javascript django websocket django-channels


【解决方案1】:

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

如果这没有帮助,请告诉我。等我上电脑再仔细看看

【讨论】:

  • 除非我没有真正理解,否则我在 consumer.py 的 old_message 中就是这样做的。问题是,一旦连接打开(所以在 js 文件中的 chatSocket.open() 中),我需要带上最新消息(因此 js 文件中的 old_messages() 函数)。
最近更新 更多