【问题标题】:Returning redirect from Flask to S3 doesn't download file从 Flask 返回重定向到 S3 不会下载文件
【发布时间】:2017-12-12 11:34:56
【问题描述】:

我需要在设置一些额外的 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

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

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

【问题讨论】:

    标签: python redirect amazon-s3 flask


    【解决方案1】:

    这是一个复合问题。直接的问题是您正在覆盖 Location 标头。但是,如果您解决了这个问题,headers aren't preserved when following redirects,那么 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
    

    以下解释了为什么覆盖 Location 标头会破坏重定向,但不能解决您的具体问题。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多