【发布时间】: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