【发布时间】:2019-12-11 13:50:35
【问题描述】:
在我的 Flask 应用程序中运行 Ajax 请求时,我遇到了令人费解的行为。我编写了一个处理程序,接收div 点击,然后将带有某些数据的 Ajax 请求发送到我的app.py 中指定的特定路由。然后将数据插入数据库。虽然这种方法在我自己的机器上运行我的 Flask 应用程序时效果很好,但在将我的应用程序移动到另一个托管服务 (Pythonanywhere) 时,每次我单击 div 时,都会发送两次请求,数据证明了这一点被插入数据库两次。
之前有人问过这个问题的类似变体(例如here 和here),但这些问题都处理POST 请求,而我使用的是GET。此外,这些问题通常涉及与 POST 请求一起提交的 HTML form,因此是附加请求。但是,我的代码没有任何形式。
我的代码示例(经过简化,但本质上与我当前的工作相同):
在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,并在.ajax的success处理程序中重置为false。我在条件语句中用这个布尔值包裹了$.ajax。
这些补丁都不起作用。然而,让我感到困惑的是为什么$.ajax 在我的机器上运行时被调用一次,但在托管服务上运行时被调用两次。跟缓存有关系吗?我该如何解决这个问题?非常感谢!
编辑:
奇怪的是,重复请求很少发生。有时,只发出一个请求,而其他时候,请求是重复的。但是,我在 Chrome 中检查了 Network XHR 输出,它只显示单个请求标头。
访问日志输出(移除 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
【问题讨论】:
-
也许你的
frontend.js被加载了两次(或其他地方),注册了两个点击处理程序。尝试在代码之前执行$('.wrapper').off('click')(尽管这将删除所有处理程序) -
您在第一次请求后收到任何控制台错误?或者尝试从控制台运行它进行调试
-
@RV 我在整个过程中没有收到任何错误。我在
success处理程序中添加了一个console.log,但是它只打印了一次。你知道这意味着什么吗? -
你确定。 ajax 调用了两次。你在网络上见过吗??
-
在服务器日志中,您是否看到请求来自同一 IP 两次?
标签: javascript jquery html ajax flask