如何将 Flask 静态指向 Amazon S3 URL?

How to point Flask static to Amazon S3 URLs?

我在 Heroku 上托管了一个 Flask 应用程序,但希望从 Amazon S3 提供静态文件。

在我的模板中,我使用 url_for() 来引用所有静态文件。然后我想在 Flask 应用程序的初始化中放入

app = Flask(__name__, static_url_path="http://my-bucket.s3.amazonaws.com")

确保使用 http://my-bucket.s3.amazonaws.com/static/ 而不是 mysite.com/static/。但是我得到这个错误:

ValueError: urls must start with a leading slash

如果我将其更改为带有前导斜线的值,它会起作用,但我希望静态 URL 指向外部域 S3,因此它需要以 http:// 开头。

我做错了什么?如何将 S3 用于 Flask 和 Heroku 的静态文件?

如果您对 Flask 对象使用任何 static_* 选项,则假设它将负责提供这些文件。 static 路由被配置为服务静态文件的视图和生成 URLs 的 url_for() 目标。

因此,仅使用 Flask,您必须将所有 url_for('static', ...) 调用替换为硬编码 URL 到您的 CDN。

相反,您应该切换到使用 Flask-CDN,这是一个方便的 Flask 附加组件,用于处理由 Flask 和 CDN 托管的静态文件之间的无缝切换:

from flask_cdn import CDN

app = Flask(__name__)
cdn = CDN(app)

并在部署到生产环境时将 CDN_DOMAIN 配置选项设置为 http://my-bucket.s3.amazonaws.com

在调试模式下,url_for() 将生成旧的 /static/.. url 供 Flask 处理,在生产模式下,url_for() 在这些 url 前加上 CDN_DOMAIN 值.如果后者保留为默认 None 设置,则不会发生此类 URL 更改,从而可以在本地 运行 Flask 并根据需要关闭 debug

请注意,url_for() 的行为仅针对 Jinja 模板进行了更改;如果您需要在视图中生成静态 URL,则必须将 flask.url_for() 换成 flask_cdn.url_for()