некорректное получение значение переменной 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 шт):
Вы говорите:
На сервере происходит по этому 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 %}
И
"Заполнение этой переменной гарантируется тем, что запрос отправляется синхронный"
не гарантируется, потому что в момент выдачи шаблонизатором кода страницы, запроса не происходит, потому что браузер запускает запрос позже.