25

基本上,缓存破坏文件上的哈希不会更新。

class S3PipelineStorage(PipelineMixin, CachedFilesMixin, S3BotoStorage):
     pass

PIPELINE_JS = {
 'main.js': {
    'output_filename': 'js/main.min.js',
    'source_filenames': [
        'js/external/underscore.js',
        'js/external/backbone-1.0.0.js',
        'js/external/bootstrap-2.2.0.min.js',
    ]
  }
}

当我第一次运行该collectstatic命令时,它正确地创建了一个名为“main.min.d25bdd71759d.js

但是,现在当我运行该命令时,它无法在后期处理阶段覆盖该缓存文件(并更新哈希)。

它不断更新“ main.min.js”,这main.min.js在我的文件系统中是最新的。但是,不会创建新的缓存文件。即使底层main.min.js 文件已更改,它仍保留相同的旧哈希。

当我手动删除 AWS 上的缓存文件时,我在运行时收到以下消息collectstatic,详细程度设置为 3:

Post-processed 'js/main.min.js' as 'js/main.min.d25bdd71759d.js

settings.DEBUG被设定为False

为什么哈希不会更新?

4

1 回答 1

3

尝试使用清单存储:

class S3PipelineManifestStorage(PipelineMixin, ManifestFilesMixin, S3BotoStorage):
    pass

根据此处的 django 文档https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/#cachedstaticfilesstorage不建议使用CachedStaticFilesStorage.

您的静态文件的文件名可能会被缓存。所以使用清单之一。

不推荐使用 CachedStaticFilesStorage - 在几乎所有情况下 ManifestStaticFilesStorage 都是更好的选择。使用 CachedStaticFilesStorage 时有几个性能损失,因为缓存未命中需要在运行时散列文件。远程文件存储需要多次往返以在缓存未命中时散列文件,因为在嵌套文件路径的情况下需要多次文件访问以确保文件散列正确。

请注意,这也记录在 django-pipelines http://django-pipeline.readthedocs.io/en/latest/storages.html#using-with-other-storages

于 2018-01-02T16:44:44.687 回答