【问题标题】:How to point Flask static to Amazon S3 URLs?如何将 Flask 静态指向 Amazon S3 URL?
【发布时间】:2015-04-01 12:32:57
【问题描述】:

我有一个托管在 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:// 开头。

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

【问题讨论】:

    标签: heroku flask static-files


    【解决方案1】:

    如果您对Flask 对象使用任何static_* 选项,则假定它将负责提供这些文件。配置了 static 路由,它既用作视图以提供静态文件,又用作 url_for() 目标以生成 URL。

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

    相反,您应该改用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 更改,从而可以根据需要在关闭 debug 的情况下在本地运行 Flask。

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

    【讨论】:

    • 太棒了,这个答案有效。也感谢您的详尽解释。不过,我最终还是使用了 Flask S3 包 (flask-s3.readthedocs.org/en/latest),因为它还可以使用一些 python 行将文件上传到亚马逊 S3 本身。再次感谢!
    • @Javaaaa:当然; Flask-S3 使用与 Flask-CDN 完全相同的模式:替换模板的 url_for() 以生成 CDN URL。但我可以想象,额外的 S3 上传功能对您来说非常方便! :-)
    猜你喜欢
    • 2011-07-11
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多