Django频道 - 当在consumer.py的循环中调用Group.send()时,客户端只收到一条消息

时间:2018-05-06 09:16:34

标签: python django django-channels

我已经构建了一个运行自动化测试的Django应用程序。我收集用户的输入,关于所有测试需要运行的内容以及当用户点击提交按钮时,测试运行几个小时到几天(取决于所选测试的数量),一次全部测试完成后,结果显示在模板上。

现在的问题是,在完成所有测试之前,用户不会更新进度。所以当我有个别测试的结果时,我决定使用Django Channles为客户端提供实时更新。

通过我的实施,我打电话给小组('用户1')。在for循环中发送({' text':i})方法。但我在模板中看到的只是最后一组(' user-1')。send({' text':i})操作的输出。

根据我的要求,一旦调用了Group(' user-1')。send({' text':i}),就会调用socket.onmessage()函数我的模板部分应该会收到该邮件,并应再次等待后续群组发送的邮件('用户1')。发送({' text':i})来电。

我看到一个非常类似的问题here已经回答了,但解决方案对我不起作用。请帮助我确定我的代码中需要更正的内容,如下所示。

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>

1 个答案:

答案 0 :(得分:0)

您正在调用document.getElementById("demo").innerHTML = message.data;这会在每次调用时覆盖demo的内容。你想要这样的东西:

document.getElementById("demo").innerHTML += message.data 要么 document.getElementById("demo").innerHTML += '<br />' + message.data

如果此答案解决了您的问题,请将其标记为正确。