Использование 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 (в котором я, по общему признанию, новичок). Любые предложения, которые вы можете предоставить, будут очень признательны!

Вернуться на верх