Flask + Ajax вызовы "случайно" не выполняются, так как пользователь не аутентифицирован - PullRequest
0 голосов
/ 24 марта 2020

У меня есть приложение Flask, работающее на Heroku, с python официантским сервером WSGI.

На одной странице 9 Ajax вызовов в одном и том же представлении Flask (каждый вызов с различные параметры) возвращая объект JSON. Представление требует, чтобы пользователь прошел аутентификацию: я использую декоратор @login_required и расширение прокси-сервера flask *1039* для этого конца.

Flask представление

@dashboard.route('/_dashboard_std_summary', methods=['POST'])
@login_required
def _dashboard_std_summary():
    """ Return the data for the dashboard """
    param = request.get_json()
    # executes a query using the id of the logged in 
    # user (current_user.id) and some data passed with 
    # the request, and builds a dict called data
    ...

    return jsonify(success=1,
                   data=data)

Ajax вызов (один из девяти)

Этот код является частью шаблона, который 9 раз включается на главной странице. widget_field_id уникален и передается каждому шаблону (возможно, не лучшая архитектура, но он работает локально).

$.ajax({
        type: "POST",
        headers: {
            "X-CSRFToken": "{{ csrf_token() }}"
            },
        url: "{{ url_for('dashboard._dashboard_std_summary') }}",
        data: JSON.stringify({widget_field_id: '{{ widget_field_id }}',
                              status: '100'
                          }, null, '\t'),
        contentType: "application/json;charset=UTF-8",
        dataType: "json",
        async: true,
    })
    .done(function(response){
            ... do something with the reponse ...
    })

Все отлично работает локально на моей машине, но когда я загружаю на Heroku, начинаются проблемы : некоторые из этих вызовов случайно завершаются (я буквально имею в виду это случайно) с кодом 302, и вместо возврата объекта JSON ответ содержит код html страницы входа.

AFAIU, в некоторых (случайных) вызовах пользователь не распознается как аутентифицированный (хотя это происходит в других вызовах), и поток перенаправляется на страницу входа (вот почему я вижу страницу входа html код в ответе).

Если я перезагружаю страницу, не всегда вызовы ajax завершаются неудачно, но когда они это делают, не всегда одни и те же вызовы не выполняются. На следующем изображении вы видите, что 5 из 9 вызовов не состоялись, возвращая 302.

enter image description here

Я уверен, что проблема не в представлении ,

Я схожу с ума от этого. Любые предложения о том, где искать, чтобы определить проблему?

...