Я столкнулся с непонятным поведением при выполнении Ajax-запроса как части моего приложения Flask. Я написал, что обработчик получает щелчок div
, а затем отправляет запрос Ajax с определенными данными на определенный маршрут, указанный в моем app.py
. Затем данные вставляются в базу данных. Хотя этот подход работал нормально при запуске моего приложения Flask на моей собственной машине, при перемещении моего приложения в другую хостинговую службу (Pythonanywhere) каждый раз, когда я нажимаю div
, запрос отправляется дважды, так как Свидетельством тому являются данные, вставляемые дважды в базу данных.
Подобные варианты этого вопроса уже задавались (например,здесь и здесь), но все эти вопросы касаются запросов POST
, в то время как мой использует GET
. Кроме того, эти вопросы обычно включали HTML form
, который был представлен вместе с запросом POST
, и, следовательно, дополнительный запрос. Однако в моем коде нет форм.
Пример моего кода (упрощенный, но по сути такой же, как мои текущие усилия):
В frontend.html
:
<div class='wrapper'>
<div class='submit_stamp' data-timestamp='2019-8-2'>Submit</div>
</div>
В frontend.js
:
$('.wrapper').on('click', '.submit_stamp', function(){
$.ajax({
url: "/submit_time",
type: "get",
data: {time: $(this).data('timestamp')},
success: function(response) {
$('.wrapper').append(response.html);
},
});
});
В app.py
:
@app.route('/submit_time')
def submit_time():
db_manager.submit_stamp(flask.request.args.get('time'))
return flask.jsonify({'html':'<p>Added timestamp</p>'})
Таким образом, всякий раз, когда я щелкаю элемент submit_stamp
, запрос Ajax запускается дважды, временная метка дважды вставляется в мою базу данных, и "Added timestamp"
добавляется дважды к .wrapper
. Вот некоторые вещи, которые я сделал, чтобы это исправить:
Добавление
event.stopPropagation()
в обработчикИспользование системы логических флагов, в которой переменная устанавливается на
true
сразу после щелчка, и сбрасывается наfalse
в обработчикеsuccess
в.ajax
. Я обернул$.ajax
этим логическим значением в условном выражении.
Ни один из этих патчей не сработал. Что меня смущает, так это то, почему $.ajax
вызывается один раз при работе на моей машине, но вызывается дважды при работе на хостинге. Это связано с кешем? Как я могу решить эту проблему? Большое спасибо!
Изменить:
Как ни странно, дубликаты запросов происходят нечасто. Иногда делается только один запрос, в других случаях запросы дублируются. Однако я проверил вывод Network XHR в Chrome, и он отображает только один заголовок запроса.
Вывод журнала доступа (с удаленными IP-адресами):
<IP1> - - [05/Aug/2019:16:35:03 +0000] "GET /submit_time?payload=.... HTTP/1.1" 200 76 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1" "<IP>" response-time=0.217
<IP2> - - [05/Aug/2019:16:35:05 +0000] "GET /submit_time?payload=.... HTTP/1.1" 200 71 "http://www.katchup.work/create" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36" "<IP2>" response-time=0.198