Skip to main content
 首页 » 编程设计

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

2025年05月04日26zhujiabin

我需要重定向到 S3 URL,同时设置一些额外的 S3 相关 header 。 Flask 路由返回一个页面 Redirecting to <url>和一个可点击的链接,浏览器不会自动重定向。为什么重定向不起作用?

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

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

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

请您参考如下方法:

这是一个复合问题。直接的问题是您正在覆盖 Location header 。然而,如果你解决了这个问题,headers aren't preserved when following redirects ,因此 S3 不会获取 header 。

如果您需要从 S3 提供具有特殊 header 的资源,您需要通过您的应用下载并传递该文件,而不是将用户直接重定向到它。

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 

以下解释了为什么覆盖 Location header 会中断重定向,但这并不是您特定问题的解决方案。

重定向响应包括 Location header 。这就是浏览器知道下一步去哪里的方式。 redirect 设置该 header 并生成一个链接,以防浏览器不遵循它。不过,您完全替换了所有 header ,删除了 Location。使用 headers.extend 添加额外的 header ,而不是完全替换它们。

response = redirect(download_url) 
response.headers.extend(generate_s3_headers(key, md5)) 
return response