Django Channels - 当在 consumers.py 中循环调用 Group.send() 时,客户端仅收到一条消息
Django Channels - Client receives only one message when Group.send() is called in a loop in consumers.py
我构建了一个 Django 应用程序,它 运行 进行了自动化测试。我从用户那里收集输入,关于所有测试需要什么 运行 以及当用户单击提交按钮时,测试 运行 持续几个小时到几天(取决于选择的测试数量),所有测试完成后,结果将显示在模板上。
现在的问题是,直到所有测试都完成,用户才知道进度。所以我决定使用 Django Channles 在我获得个别测试的结果时向客户端提供实时更新。
在我的实现中,我在 for 循环中调用了 Group('user-1').send({'text': i}) 方法。但是我在模板中看到的只是最后一个 Group('user-1').send({'text': i}) operation.
的输出
根据我的要求,调用 Group('user-1').send({'text': i}) 后,模板部分中的 socket.onmessage() 函数应该收到消息并再次等待后续 Group('user-1').send({'text': i}) 调用发送的消息。
我看到了一个非常相似的问题 ,该问题已经得到解答,但该解决方案对我不起作用。请帮助我确定我的代码中需要更正的内容,如下所示。
consumers.py
------------
@channel_session_user_from_http
def ws_connect(message, **kwargs):
http_user = message.user
if not http_user.is_anonymous:
message.reply_channel.send({'accept': True})
Group('user-'+str(http_user.id)).add(message.reply_channel)
def ws_message(message):
for i in my_results_list:
Group('user-1').send({'text': i})
sleep(1)
results.html
------------
<script>
// Note that the path doesn't matter for routing; any WebSocket
// connection gets bumped over to WebSocket consumers
socket = new WebSocket("ws://" + window.location.host + "/task/summary/");
socket.onopen = function() {
socket.send("Hello");
}
socket.onmessage = function(message) {
document.getElementById("demo").innerHTML = message.data;
}
socket.onmessage()
// Call onopen directly if socket is already open
// if (socket.readyState == WebSocket.OPEN) socket.onopen();
</script>
您正在调用document.getElementById("demo").innerHTML = message.data;
,每次调用都会覆盖演示的内容。你想要这样的东西:
document.getElementById("demo").innerHTML += message.data
要么
document.getElementById("demo").innerHTML += '<br />' + message.data
如果这个答案解决了您的问题,请标记为正确。
我构建了一个 Django 应用程序,它 运行 进行了自动化测试。我从用户那里收集输入,关于所有测试需要什么 运行 以及当用户单击提交按钮时,测试 运行 持续几个小时到几天(取决于选择的测试数量),所有测试完成后,结果将显示在模板上。
现在的问题是,直到所有测试都完成,用户才知道进度。所以我决定使用 Django Channles 在我获得个别测试的结果时向客户端提供实时更新。
在我的实现中,我在 for 循环中调用了 Group('user-1').send({'text': i}) 方法。但是我在模板中看到的只是最后一个 Group('user-1').send({'text': i}) operation.
的输出根据我的要求,调用 Group('user-1').send({'text': i}) 后,模板部分中的 socket.onmessage() 函数应该收到消息并再次等待后续 Group('user-1').send({'text': i}) 调用发送的消息。
我看到了一个非常相似的问题
consumers.py
------------
@channel_session_user_from_http
def ws_connect(message, **kwargs):
http_user = message.user
if not http_user.is_anonymous:
message.reply_channel.send({'accept': True})
Group('user-'+str(http_user.id)).add(message.reply_channel)
def ws_message(message):
for i in my_results_list:
Group('user-1').send({'text': i})
sleep(1)
results.html
------------
<script>
// Note that the path doesn't matter for routing; any WebSocket
// connection gets bumped over to WebSocket consumers
socket = new WebSocket("ws://" + window.location.host + "/task/summary/");
socket.onopen = function() {
socket.send("Hello");
}
socket.onmessage = function(message) {
document.getElementById("demo").innerHTML = message.data;
}
socket.onmessage()
// Call onopen directly if socket is already open
// if (socket.readyState == WebSocket.OPEN) socket.onopen();
</script>
您正在调用document.getElementById("demo").innerHTML = message.data;
,每次调用都会覆盖演示的内容。你想要这样的东西:
document.getElementById("demo").innerHTML += message.data
要么
document.getElementById("demo").innerHTML += '<br />' + message.data
如果这个答案解决了您的问题,请标记为正确。