一、问题描述
今天在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" οnclick="disp_prompt()">下载我的简历</a>
由于异步的原因,ajax在等待后端返回数据的时候,浏览器会继续往下执行跳转a的超链接的操作,然后就会导致ajax与后端的连接断开!于是把a标签改成button标签,问题解决!!
还在网上看到一篇博客这么说的:
ConnectionAbortedError: [WinError 10053] 您的主机中的软件中止了一个已建立的连接。
解决方法:找到python/Lib/socketserver.py文件,修改SocketWriter类的write方法,具体如下:
def write(self, b):
try:
self._sock.sendall(b)
except Exception as e:
self._sock.close()
with memoryview(b) as view:
return view.nbytes