我正在使用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请求来执行轮询并获得下载状态。
答案 0 :(得分:0)
首先,它看起来像代码检查POST值。 如果请求方法是POST或GET,请修复此检查。如果它是GET,那么你需要渲染到显示文件进度的页面。