django 报错 ConnectionAbortedError: [WinError 10053] 您的主机中的软件中止了一个已建立的连接

一、问题描述
今天在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
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值