如何将 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()
。
我在 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()
。