2017-12-12 13 views
0

S3関連のヘッダーを追加設定する際にS3 URLにリダイレクトする必要があります。 FlaskルートがRedirecting to <url>とクリック可能なリンクを持つページを返しています。ブラウザは自動的にリダイレクトされません。リダイレクトが機能しないのはなぜですか?FlaskからS3へのリダイレクトがファイルをダウンロードしない

@app.route("/download/<token>") 
def download(token): 
    ... 
    response = redirect(download_url) 
    response.headers = generate_s3_headers(key, md5) 
    return response 

リクエストを使用してファイルを正常にダウンロードできます。

import requests 
r = requests.get(download_url, headers=headers) 

答えて

1

これは複合的な問題です。すぐ直面する問題は、Locationヘッダーを上書きすることです。しかし、それを修正すれば、headers aren't preserved when following redirectsなので、S3はヘッダを取得しません。

特別なヘッダーを使用してS3からリソースを提供する必要がある場合は、ユーザーに直接リダイレクトするのではなく、アプリを介してそのファイルをダウンロードして渡す必要があります。

stream = requests.get(url, headers=headers, stream=True) 
response = app.response_class(r.iter_content()) 
response.headers.set('Content-Disposition', 'attachment') 
return response 

次はLocationヘッダをオーバーライドすることはリダイレクトを壊す理由の説明ですが、あなたの特定の問題への解決策ではありません。

リダイレクト応答には、Locationヘッダーが含まれます。これはブラウザが次にどこへ行くかを知る方法です。 redirectは、ヘッダーを設定し、ブラウザーがそれに従わない場合にリンクを生成します。あなたは完全にすべてのヘッダーを置き換えて、Locationを削除しています。余分なヘッダーを完全に置き換えるのではなく、追加するにはheaders.extendを使用してください。

response = redirect(download_url) 
response.headers.extend(generate_s3_headers(key, md5)) 
return response 
関連する問題