Я создал приложение 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>