一、问题描述
今天在django中调用ajax时,报错了:
Exception happened during processing of request from ('127.0.0.1', 7160)
Traceback (most recent call last):
File "E:\DevelopSoftware\Anaconda3\envs\mxonline\lib\socketserver.py", line 650, in process_request_thread
self.finish_request(request, client_address)
File "E:\DevelopSoftware\Anaconda3\envs\mxonline\lib\socketserver.py", line 360, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "E:\DevelopSoftware\Anaconda3\envs\mxonline\lib\socketserver.py", line 720, in __init__
self.handle()
File "E:\DevelopSoftware\Anaconda3\envs\mxonline\lib\site-packages\django\core\servers\basehttp.py", line 153, in handle
self.handle_one_request()
File "E:\DevelopSoftware\Anaconda3\envs\mxonline\lib\site-packages\django\core\servers\basehttp.py", line 161, in handle_one_request
self.raw_requestline = self.rfile.readline(65537)
File "E:\DevelopSoftware\Anaconda3\envs\mxonline\lib\socket.py", line 589, in readinto
return self._sock.recv_into(b)
ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。
ajax就是普通的jquery中的ajax:
var my_email = {"email":email};
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
headers: { "X-CSRFToken": token_csrf },
url: "/myemail/",
dataType: "json",
cache: false,
data: JSON.stringify(my_email),
async : true,
timeout: 5000,
error: function (data) {
alert("服务器错误!邮件发送失败!");
},
success: function (data) {
if (null != data && "" != data) {
if(data.status == "1"){
alert("邮件发送成功,请查收!");
}else{
alert("邮件发送错误!")
}
}
}
});
二、处理
平时这么写也没报错,今天这样写怎么就报错了,我就纳了闷了。网上查了半天,说是要把异步改成同步,也就是把ajax中的 async:true 改成 async:false。
改了以后发现确实不报错了,但又出现一个比较严重的问题是,使用同步后因为ajax要等后端返回数据,而我后端因为要调用发送邮件的函数,处理的比较慢,因此前端就一直处于假死的状态。因此这样改对于我来说还是不能接受的。
然后又查了很多资料,说是使用$.Deferred(); 以及 async/await 异步请求等待返回数据。但是我尝试后,发现一中的问题又双叒出现了!又给我报错了。
三、转机
然后感谢这篇文章:https://www.bbsmax.com/A/ZOJPmXOe5v/
突然明白为什么会报这个错了,是因为我网页刷新导致ajax和服务器的连接断开了!而为什么我的网页会刷新呢?
因为我把这个ajax请求绑在了一个超链接a标签上,
<a href="{% url 'resume:download' %}" class="btn-rounded-white" onclick="disp_prompt()">下载我的简历</a>
由于异步的原因,ajax在等待后端返回数据的时候,浏览器会继续往下执行跳转a的超链接的操作,然后就会导致ajax与后端的连接断开!于是把a标签改成button标签,问题解决!!
另外,参考:https://blog.csdn.net/BobYuan888/article/details/107871596
button的type有三种:button、reset、submit,如果没写type,默认type不是你以为的“button”,而是“submit”,“submit”,“submit”!!!页面也会被被刷新,因此不要省略type的类型。
我这个报错也算是个个例,不具有普遍性,如果你们不是因为这个原因,那建议你们还是朝第二步的方向去解决。
就写到这吧。