Ajax GET请求已发送两次

Aja*_*234 11 html javascript ajax jquery flask

作为Flask应用程序的一部分运行Ajax请求时,遇到了令人困惑的行为。我已经编写了一个处理程序来接收div点击,然后将带有某些数据的Ajax请求发送到我的中指定的特定路由app.py。然后将数据插入数据库。尽管在自己的计算机上运行Flask应用程序时,这种方法效果很好,但是将应用程序移至另一个托管服务(Pythonanywhere)时,每次单击div,请求都会被发送两次,这证明了将数据两次插入到数据库。

曾经有人问过这个问题的类似变体(例如,在这里这里),但是POST当我使用时,这些问题都处理了请求GET。此外,这些问题通常涉及formPOST请求一起提交的HTML ,因此是附加请求。但是,我的代码没有任何形式。

我的代码示例(经过简化,但实际上与我目前的工作相同):

frontend.html

<div class='wrapper'>
   <div class='submit_stamp' data-timestamp='2019-8-2'>Submit</div>
</div>
Run Code Online (Sandbox Code Playgroud)

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);
     },

   });
});
Run Code Online (Sandbox Code Playgroud)

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>'})
Run Code Online (Sandbox Code Playgroud)

这样,每当我单击该submit_stamp元素时,Ajax请求都会触发两次,时间戳两次插入到我的数据库中,并且"Added timestamp"两次附加到.wrapper。我为解决此问题所做的一些事情包括:

  1. event.stopPropagation()在处理程序中添加

  2. 使用布尔标志系统,在该系统中true,单击后将变量设置为,然后false在中将其重置为success处理程序.ajax。我将$.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
Run Code Online (Sandbox Code Playgroud)

Aja*_*234 3

感谢所有回复的人。最终,我能够通过两种不同的解决方案解决这个问题:

1) 首先,我能够通过检查后端的 IP 来阻止违规请求:

@app.route('/submit_time')
def submit_time():
   _ip = flask.request.environ.get('HTTP_X_REAL_IP', flask.request.remote_addr)
   if _ip == '128.177.108.218':
     return flask.jsonify({'route':'UNDEFINED-RESULT'.lower()})
   return flask.jsonify({"html":'<p>Added timestamp</p>'})
Run Code Online (Sandbox Code Playgroud)

以上实际上更多的是临时破解,因为无法保证目标 IP 保持不变。

2)但是,我发现在HTTPS上运行也删除了重复的请求。最初,我从 Pythonanywhere 仪表板加载我的应用程序,结果是http://www.testsite.com. 然而,当我安装了正确的 SSL 证书、刷新页面并再次运行请求后,我发现生成了所需的结果。

我将赏金授予@computercarguy,因为他的帖子促使我思考我最初的尝试失败的外部/网络相关原因。