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" 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的类型。

 

我这个报错也算是个个例,不具有普遍性,如果你们不是因为这个原因,那建议你们还是朝第二步的方向去解决。

就写到这吧。

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值