从Flask返回重定向到S3不会下载文件

Wig*_* A. 1 python redirect amazon-s3 flask

在设置一些与S3相关的标头时,我需要重定向到S3 URL。Flask路线返回的页面带有Redirecting to <url>和可单击的链接,并且浏览器不会自动重定向。为什么重定向不起作用?

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

我可以使用请求成功下载文件。

import requests
r = requests.get(download_url, headers=headers)
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 5

这是一个复合问题。直接的问题是您要覆盖Location标头。但是,如果解决此问题,则在进行重定向时不会保留标头,因此S3将不会获得标头。

如果您需要使用特殊的标头提供来自S3的资源,则需要下载并通过您的应用传递该文件,而不是将用户直接重定向到该文件。

headers = generate_s3_headers(key, md5)
r = requests.get(url, headers=headers, stream=True)
response = app.response_class(r.iter_content())
response.headers.set('Content-Disposition', 'attachment')
return response
Run Code Online (Sandbox Code Playgroud)

以下说明了为什么覆盖Location标头会中断重定向,但又不能解决您的特定问题。

重定向响应包括Location标头。这是浏览器知道下一步的方法。redirect设置标题,并在浏览器不跟随它的情况下生成链接。不过,您将完全替换所有标题,而将删除Location。使用headers.extend添加您额外的头,而不是完全替换它们。

response = redirect(download_url)
response.headers.extend(generate_s3_headers(key, md5))
return response
Run Code Online (Sandbox Code Playgroud)