некорректное получение значение переменной session flask javascript

Отправляю POST-запрос из шаблона следующим образом:

{% block test_block %}
    console.log('FROM test_block ');
    $.ajax({
        data: {
            'service_name':'{{ session['servicename'] }}',
            'master_name': '{{ session['mastername'] }}'
        },
        url: '{{url_for('main.main_get_allow_dates')}}',
        type: 'POST',
        async: false
    }).done(function(){
        console.log('ajax post done!');
        var a = '{{ session['allow_dates'] | safe }}';
    }).fail(function(){
        console.log('ajax post fail!');
    });

{% endblock %}

На сервере происходит по этому POST-запросу некоторая работа, после которой в session['allow_dates'] записывается словарь.

После этого (по идее) в секции .done(...) AJAX-функции должно в консоль вывестись сообщение ajax post done!, а в переменной a оказаться значение словаря, полученного при работе функции на сервере.

Заполнение этой переменной гарантируется тем, что запрос отправляется синхронный (async: false) (хотя тут я не уверен). Вот что происходит при запуске:

<script>

        $(document).bind('ready',function(){
            console.log('from base ready');




    console.log('FROM test_block ');
    $.ajax({
        data: {
            'service_name':'service_1',
            'master_name': 'dima'
        },
        url: '/main_get_allow_dates',
        type: 'POST',
        async: false
    }).done(function(){
        console.log('ajax post done!');
       var a = '';
    }).fail(function(){
        console.log('ajax post fail!');
    });


        })

        ;

    </script>

Как видно из полученного "выхлопа", переменные service_name и master_name корректно заполняются из переменной session, в консоли действительно появляется ajax post done!, однако в переменной a просто пустая строка, хотя там действительно должен появиться словарь (проверял на стороне сервера по таким же входным данным).

Подскажите, пожалуйста, в чём тут проблема?


Ответы (1 шт):

Автор решения: Pavel Grishaev

Вы говорите:

На сервере происходит по этому POST-запросу некоторая работа, после которой в session['allow_dates'] записывается словарь.

Но пишете в переменную 'a' значение до запроса, в момент выдачи блока на страницу. Вам переменную 'a' нужно получать из js в методе .success( data ){ let a = data }, а не шаблонизатором:

{% block test_block %}
    console.log('FROM test_block ');
    $.ajax({
        data: {
            'service_name':'{{ session['servicename'] }}',
            'master_name': '{{ session['mastername'] }}'
        },
        url: '{{url_for('main.main_get_allow_dates')}}',
        type: 'POST'
    }).success(function( data ){
        console.log('ajax post done!');
        var a = data;
    }).error(function(){
        console.log('ajax post fail!');
    });

{% endblock %}

И

"Заполнение этой переменной гарантируется тем, что запрос отправляется синхронный"

не гарантируется, потому что в момент выдачи шаблонизатором кода страницы, запроса не происходит, потому что браузер запускает запрос позже.

→ Ссылка