我已经用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
}
)
谢谢!
答案 0 :(得分:0)
您是否尝试过ModelName.objects.all()。reverse()?排序将是最新的,因此您可能不需要old_messages()。
如果这没有帮助,请告诉我。装好电脑后,我会更好看