1

PUTリクエストを受け入れるダミーの django ビューを作成しました。

# urls.py
url(r'^put/.*$', 'put', name='put'),

# views.py
def put(request):
    print request.method
    return HttpResponse()

PUTここで、ビューに対して xhr 呼び出しを実行しようとすると、403 が返されます。

[27/Sep/2012 22:32:43] "PUT /put/x-unconverted/e02ed7da08d411e2bfa974de2b4d1b84?partNumber=115&uploadId=35UxOsGCCG98rke3VjpazmCy.0ZFpesndJ.XPp5Bw6R2CumfIsYKP5DlBYPY3gh3I0PCwfCg4DqSRttYp75bZg-- HTTP/1.1" 403 156400

(なぜ403 が返されるのか、今は気にしません)。本当の問題はこれです:

ここに画像の説明を入力

XHR 呼び出しは、実際の応答がコンテンツ付きの 403 であった場合でも、ステータス 0 (中止?!) を返します (コンテンツの長さが 156400 であることに注意してください)。

403 応答が表示されないのはなぜですか?

EDIT :PUTリクエストは次のように行われます:

var xhr = new XMLHttpRequest();
var path = "/" + u.settings.key;
path += "?partNumber=" + (chunk + 1) + "&uploadId=" + u.upload_id;

var method = "PUT";
var authorization = "AWS " + u.settings.access_key + ":" + signature;
var blob = u.file.slice(start, end); // mozSlice / webkitSlice, depending on browser
xhr.upload.addEventListener("progress", progress_handler);
xhr.addEventListener("readystatechange", handler);
xhr.addEventListener("error", error_handler);
xhr.addEventListener("timeout", error_handler);

xhr.open(method, /*u.settings.host*/ "http://localhost:8000/put" + path, true);

xhr.setRequestHeader("x-amz-date", date);
xhr.setRequestHeader("Authorization", authorization);
xhr.setRequestHeader("Content-Type", u.settings.content_type);
xhr.setRequestHeader("Content-Disposition", "attachment; filename=" + u.file.name);

xhr.send(blob);
4

1 に答える 1

0

ブラウザは、アクセス禁止を意味する403を受信したときに、クロスドメインリクエストであると想定していると思います。これが、ブラウザがリクエストを行ったjavascriptコードにデータを処理しない理由です。サーバーは、すべての応答に対して「Action-Control-Allow-Origin」ヘッダーを送信する必要があります。

于 2012-09-28T18:06:25.973 に答える