Каналы Django - Клиент получает только одно сообщение, когда Group.send () вызывается в цикле в consumer.py - PullRequest
0 голосов
/ 06 мая 2018

Я создал приложение Django, которое запускает автоматическое тестирование. Я собираю данные от пользователя о том, какие тесты необходимо выполнить, и когда пользователь нажимает кнопку «Отправить», тесты запускаются от нескольких часов до пары дней (в зависимости от количества выбранных тестов) и один раз все тесты завершены, результаты показаны в шаблоне.

Теперь проблема в том, что, пока все тесты не будут завершены, пользователь не будет обновлен с прогрессом. Поэтому я решил использовать Django Channles, чтобы предоставить клиенту оперативное обновление, как и когда у меня будут результаты для отдельных тестов.

В моей реализации я вызываю метод Group ('user-1'). Send ({'text': i}) в цикле for. Но все, что я вижу в шаблоне, это только выходные данные последней операции Group ('user-1'). Send ({'text': i}).

Согласно моему требованию, после вызова Group ('user-1'). Send ({'text': i}) функция socket.onmessage () в разделе моего шаблона должна получить сообщение и должна снова дождитесь сообщений, отправленных последующими групповыми ('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>

1 Ответ

0 голосов
/ 06 мая 2018

Вы звоните document.getElementById("demo").innerHTML = message.data;, это перезаписывает содержание демо при каждом вызове. Вы хотите что-то вроде:

document.getElementById("demo").innerHTML += message.data или же document.getElementById("demo").innerHTML += '<br />' + message.data

Если этот ответ решит вашу проблему, отметьте его правильно.

...