2017-10-25 6 views
0

ファイルの進行状況をダウンロードして追跡するサーバーを作成するためにDjangoを使用しています。これは、ダウンロードリンクのURLの入力欄があり、私はダウンロードをクリックしたら、それは次のJavaScriptコードを実行します。ページがリフレッシュ/再オープンされたときにDjango POSTレスポンスがスローされます

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); 
} 

ジャンゴviews.pyを私はリロードされませんのIF

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

は、これは完全に正常に動作しますページをダウンロードした後にPOSTリクエストはDjangoコマンドプロンプトウィンドウにのみ記録されます(readyStateチェック)。

ただし、ダウンロードが開始された後にページを開く他のユーザーのために、ダウンロードの進行状況がページに表示されます。しかしこれはDjangoに大きなエラーを投げています.4つの例外のようなものがあります。必要であれば、私は後でそれを投稿することができますが、主なものはあると思われる:
ConnectionAbortedError:[WinError 10053]確立された接続は

は私が何だと信じているホストマシンのソフトウェアによって中止されました間違っているのは、要求を生成しなかったクライアントに応答を送信しようとしていることです。
クライアントが元のリクエストを送信しなかった場合でもPOST応答を受け取る方法はありますか?それとも、私がしようとしていることをする別の方法はありますか?

ありがとうございます!

追加情報:
POSTの代わりにGETを試しても同じ問題が発生します。

私はここでの主な問題は、POSTリクエストのみしばらく時間がかかることができ、操作「start_download」仕上げ、一度クライアントに答えを返していることであると信じています。代わりに、 "成功"または "失敗"の応答を送信してダウンロードを開始し、GET要求を使用してポーリングを実行し、ダウンロード状況を取得する必要があります。

+0

ダウンロードの進行中にページをリロードした場合のエラーを表示できますか? – aquaman

+0

私はすでに(別の機能で)何が行われる必要があると思います。私は答えを得るためにクライアント上でポーリングを行う必要があります。なぜなら、クライアントによって作られなかったリクエストに対する応答を受け入れないからです。 – GuiFGDeo

+0

@aquaman、 "reload"が発生したときにエラーは発生しません。例外は、ポストレスポンスがサーバーからクライアントに送信された場合にのみキャプチャされます。 – GuiFGDeo

答えて

0

まず、POST値のコードチェックのようです。 要求メソッドがPOSTまたはGETの場合、このチェックを修正します。 GETの場合は、ファイルの進行状況を表示するページにレンダリングする必要があります。

関連する問題