我需要在设置一些额外的S3相关标头时重定向到S3网址。 Flask路线返回包含Redirecting to <url>
和可点击链接的页面,浏览器不会自动重定向。为什么重定向不起作用?
@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)
答案 0 :(得分:4)
这是一个复合问题。当前的问题是您要覆盖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