【问题标题】:Django with django pipeline / Amazon s3 / Cloudfront : versioning assetsDjango 与 django 管道/Amazon s3/Cloudfront:版本控制资产
【发布时间】:2013-01-10 05:52:11
【问题描述】:

我们最近搬到 Heroku avec,我们决定使用 Cloudfront 分发将我们的资产存储在 Amazon S3 上。

我使用 Django Pipeline 来压缩/编译我的资产,但我没有设法让它指向正确的版本。 当我运行“collectstatic”管理命令时,它运行良好:

后处理 'css/compress_profile_school.css' 为 'css/compress_profile_school.82973855aca5.css 后处理 'css/compress_profile.css' 为 'css/compress_profile.d120536e24f9.css 后处理 'css/compress_document.css' 为 'css/compress_document.864dd7603769.css ...

但是当我运行应用程序时,它没有指向正确的版本(它使用没有哈希的版本)。

应用程序正在这里运行:http://dev.unishared.com/

似乎 Django 捆绑的静态文件应用程序也无法指向正确的版本。

每次我推送新的资产版本时,我都必须使我的 Cloudfront 发行版失效,这需要时间..

感谢您的帮助。

【问题讨论】:

  • 您可以添加您的 STATIC_* 和 PIPELINE_* 设置吗?
  • 这里是:class S3PipelineStorage(PipelineMixin, CachedFilesMixin, StaticStorage): pass PIPELINE_STORAGE = 'UniShared_python.website.helpers.amazons3.S3PipelineStorage' STATICFILES_STORAGE = 'UniShared_python.website.helpers.amazons3.S3Pipeline_Storage' DEFAULT = 's3_folder_storage.s3.DefaultStorage'

标签: django heroku amazon-s3 assets amazon-cloudfront


【解决方案1】:

您的情况可能会有所不同,但通常最好不要使用 S3 提供此内容。

摘自whitenoise docs

我不应该使用类似的东西将我的静态文件推送到 S3 Django-Storages?

不,你不应该。这个的主要问题 方法是 Amazon S3 目前无法选择性地提供 gzipped 内容给您的用户。 Gzipping 可以显着减少 CSS 和 JavaScript 所需的带宽。但是虽然所有浏览器 在今天使用可以解码 gzip 内容,您的用户可能落后 无法处理的蹩脚的公司代理或防病毒扫描程序 正确压缩内容。 Amazon S3 强制您选择是否 向任何人(浪费带宽)或所有人提供压缩内容 (冒着让某些用户破坏您的网站的风险)。

...剪辑...

基于推送的方法处理静态文件的第二个问题 是它增加了部署过程的复杂性和脆弱性: 特定于您的存储后端的额外库,额外配置 和身份验证密钥,以及必须在特定时间运行的额外任务 部署中的点,以便一切正常。

我使用 django-pipelines 在部署时加入和缩小我的内容,使用 whitenoise 提供静态内容,并使用 Cloudfront CDN 进行缓存。

我关注了this how-to,开始吧。

这也意味着我只为 CDN 点击付费,而不是 CDN + S3。

【讨论】:

    【解决方案2】:

    多亏了cyberdelia,我才得以成功。

    首先,“CachedFilesStorage”仅在您的 DEBUG 设置已关闭 (= False) 时将 hashname 放入文件名中。 它在我的生产服务器上运行良好。

    从这里开始,“collectstatic”命令正在 S3 上上传正确的文件(名称中带有哈希)。 我遇到了第二个问题:缓存的 URL 指向 S3 存储桶,而不是“STATIC_URL”设置中定义的 Cloudfront。 我认为这与我的自定义存储使用的 django-storages / boto 有关,它适用于 S3 而不是 Cloudfront:

    class S3PipelineStorage(PipelineMixin, CachedFilesMixin, StaticStorage):
    pass
    

    (静态存储是一个 S3BotoStorage 子类,其位置设置为“静态”)。

    现在,我必须想办法让它在 Cloudfront 而不是 S3 上正常工作。

    感谢您的帮助!

    编辑:

    我想通过这篇文章让它工作:Django-compressor: how to write to S3, read from CloudFront?

    当您定义“自定义域”键时,它将使用 Cloudfront 域而不是 Amazon S3。

    我忘了提到我必须将 AWS_QUERYSTRING_AUTH 设置为 False 才能使其正常工作。

    【讨论】:

      【解决方案3】:

      不要设置PIPELINE_STORAGE,除非你真的知道自己在做什么,否则只需设置STATICFILES_STORAGE。见storages documentation

      【讨论】:

      • 嗨,起初我没有设置 PIPELINE_STORAGE 变量。接下来,我找到它并尝试但没有解决问题。使用的静态始终是非版本化的(名称中没有哈希)。感谢您的帮助
      • 你在 heroku 上运行 collectstatic 吗?
      • 还有,你用的是什么缓存,redis,memcached?
      • 我正在通过 AWS Elasticache 使用 memcached,是的,我在 Heroku 上运行 collectstatic(参见我最初的帖子,有输出)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2012-09-16
      • 2019-12-17
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多