Использование AJAX для проверки готовности данных с помощью опроса
У меня есть приложение Django, и я пытаюсь использовать Ajax и Redis для опроса завершения длительного вычисления. Трудность, с которой я сталкиваюсь, заключается в том, что мой Ajax "вспоминает себя" после периода тайм-аута.
Мое предполагаемое действие заключается в том, чтобы Ajax проверял завершение процесса (на который указывает канал Redis). Трудность, с которой я сталкиваюсь, заключается в том, что Ajax вызывается один раз при загрузке страницы, еще раз при нажатии на кнопку (что и предполагалось), но не "повторно опрашивает" через регулярные 3-секундные интервалы, чтобы проверить мое представление получения результата.
Вот view.py:
@login_required()
def retrieveAsync(request):
if is_ajax(request=request) and request.method == "GET":
show_df = request.session['win_deep_show_df']
df = []
msg = ['you have called retrieveAsync']
if show_df == False:
ret_val = {
'do_what': 'nothing',
'msg': msg,
'df': df,
}
# user has not requested the dataframe info yet...do nothing
return JsonResponse(ret_val, status=200)
elif show_df == True:
redisChannel = request.session['win_deep_redis_channel']
data_ready = (REDIS_INSTANCE.get(redisChannel + 'reco_data_ready').decode('utf-8') == 'yes')
if data_ready is False:
msg = "Loading data..."
ret_val = {
'do_what': 'wait',
'msg': msg,
'df': df,
}
return JsonResponse(ret_val, status=200)
elif data_ready is True:
ret_dict = pickle.loads(REDIS_INSTANCE.get(redisChannel + 'ret_dict'))
msg = "Your data is ready now..."
ret_val = {
'do_what': 'complete',
'msg': msg,
'df': df,
}
return JsonResponse(ret_val, status=200)
return JsonResponse({}, status=400)
Вот html, содержащий ajax:
{% block javascript %}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$.ajax({
url: '/clashstats/win_deep/get_ajax/',
type: 'get',
headers: { "X-CSRFToken": csrftoken },
success: function(ret_val) {
if (ret_val.do_what == 'nothing') {
$("#message_loading_space").html(ret_val.df);
} else {
if (ret_val.do_what == 'wait') {
if (cnt < 6) {
$("#message_loading_space").html(ret_val.msg);
cnt++;
setTimeout(function() { ajax_request(); }, 3000); // wait 3 seconds than call ajax request again
}
} else {
if (ret_val.do_what == 'complete') {
$("#message_loading_space").html(ret_val.msg);
}
}
}
},
})
});
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
</script>
{% endblock javascript %}
Я вижу два вызова ajax в журнале (первый при начальной загрузке страницы, второй при нажатии), и мой логический тест redis работает правильно. Так что, похоже, дело в моем сценарии ajax (в котором я, по общему признанию, новичок). Любые предложения, которые вы можете предоставить, будут очень признательны!