如果刷新/重新打开页面,Django POST Response会抛出异常

时间:2017-10-25 12:31:15

标签: javascript python ajax django post

我正在使用Django来创建一个服务器,它将下载并跟踪文件的进度。它有一个输入字段用于下载链接的URL,一旦我点击下载,它就会执行以下javascript代码:

的index.html

function startDownload() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            completedFile = xhttp.responseText;
            document.getElementById(completedFile + "ProgBar").style.width = "100%";
            document.getElementById(completedFile + "ProgBar").innerHTML = "Completed!";
            setTimeout(delProgBar, 5000, completedFile);
        }
    };
    xhttp.open("POST", "http://localhost:8000/download/start/", true);
    xhttp.setRequestHeader("X-CSRFToken", '{{ csrf_token }}');
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    var downloadLink = document.getElementById("downloadInput").value;
    var sendString = "url=" + downloadLink;
    var downloadArray = downloadLink.split('/');
    var downloadName = downloadArray[downloadArray.length-1];
    addProgBar(downloadName, "0");
    xhttp.send(sendString);
}

Django views.py

def start(request):
    aux = request.POST['url']
    file_name = start_download(aux)
    print("###########")
    print(file_name)
    return HttpResponse(file_name)

这完全正常 IF 我开始下载后没有重新加载页面。 POST请求仅在完成后记录在Django命令提示符窗口中(readyState检查)。

但是,该页面应显示下载开始后打开该页面的其他人的下载进度。然而,这给Django带来了一个很大的错误,例如4个异常。如果有必要,我可以稍后发布,但主要的似乎是:
ConnectionAbortedError:[WinError 10053]已建立的连接已被主机中的软件中止

我认为我所做错的是尝试向未生成请求的客户发送回复。
即使客户端没有发送原始请求,有没有办法接收POST响应?或者还有另一种方法可以做我正在尝试的事情吗?

非常感谢!

其他信息:
尝试使用GET而不是POST,同样的问题也会发生。

我认为这里的主要问题是POST请求只在操作“start_download”完成后才返回客户端的答案,这可能需要一段时间。我应该发送一个“成功”或“失败”的响应来开始下载并使用GET请求来执行轮询并获得下载状态。

1 个答案:

答案 0 :(得分:0)

首先,它看起来像代码检查POST值。 如果请求方法是POST或GET,请修复此检查。如果它是GET,那么你需要渲染到显示文件进度的页面。