我有一个在 Heroku 上托管的 Flask 应用程序,但希望从 Amazon S3 提供静态文件。
在我的模板中,我使用 url_for() 来引用静态文件。在 Flask 应用程序的初始化中,我想把
app = Flask(__name__, static_url_path="http://my-bucket.s3.amazonaws.com")
确保不是 mysite.com/static/,http://my-bucket.s3.amazonaws.com/static/ http://my-bucket.s3.amazonaws.com/static/用来。但是我收到这个错误:
ValueError: urls must start with a leading slash
如果我将其更改为带有前导斜杠的值,它就可以工作,但我希望静态 URL 指向 S3(一个外部域),因此它需要以 http:// 开头。
我究竟做错了什么?如何通过 Flask 和 Heroku 将 S3 用于静态文件?
如果您正在使用任何static_*
的选项Flask
对象,假设它将负责提供这些文件。 Astatic
路由配置为既作为提供静态文件的视图,又作为url_for()
生成 URL 的目标。
因此,仅使用 Flask,您就必须替换所有url_for('static', ...)
改为使用硬编码 URL 调用您的 CDN。
相反,您应该改用Flask-CDN https://flask-cdn.readthedocs.org/en/latest/,一个方便的 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/..
Flask 在生产模式下要处理的 url,url_for()
在这些 url 前面加上前缀CDN_DOMAIN
价值。如果后者保留默认值None
设置,不会发生此类 URL 更改,从而可以在本地运行 Flaskdebug
根据需要关闭。
请注意,url_for()
仅被改变对于 Jinja 模板;如果您需要在视图中生成静态 URL,则必须交换flask.url_for()
出去为了flask_cdn.url_for() https://flask-cdn.readthedocs.org/en/latest/#flask_cdn.url_for.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)