我需要重定向到 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
