Collectstatic创建空文件

时间:2018-04-24 10:37:48

标签: python django django-storage

我尝试将应用升级到Django 1.11,但遇到collectstatic的问题。

旧版本:

django 1.8.17 
django-storages 1.5.1

新版本:

django 1.11.12
django-storages 1.6.6

存储

class StaticS3BotoStorage(ManifestFilesMixin, S3BotoStorage):
    location = 'static'
    file_overwrite = True
    preload_metadata = True

class StaticS3BotoStorage(CachedFilesMixin, S3BotoStorage):
    location = 'static'
    file_overwrite = True
    preload_metadata = True

对于旧版本,collectstatic工作正常,包括collectstatic --clear

升级后,collectstatic --clear失败(没有文件被删除)。 collectstatic会复制文件,但有时会创建同一文件的两个版本。在此特定示例中,我得到base.hash1.cssbase.hash2.cssbase.hash2.css为空,因此页面打开,但无法正确呈现。

如果我不使用CachedFilesMixinManifestFilesMixincollectstatic工作正常,但明确仍然失败。

我测试了django 1.11和django-storage的不同组合,但它们似乎都表现得一样。

其他人是否遇到类似问题?

1 个答案:

答案 0 :(得分:4)

我们遇到了同样的问题。

我认为潜在的问题有多个问题/来源:

  • ManifestFilesMixin使用并重用ContentFile对象来生成散列文件并将其保存多次。无需重置ContentFile对象(通过对它们调用.seek(0))。
  • S3BotoStorage保存这些文件,而不检查它们是否在正确的位置。将此与FileSystemStorage进行比较:始终通过迭代文件的.chuncks()从头开始读取文件。

我们通过像这样覆盖S3BotoStorage来解决空文件问题:

class PatchedS3StaticStorage(S3BotoStorage):
    def _save(self, name, content):
        if hasattr(content, 'seek') and hasattr(content, 'seekable') and content.seekable():
            content.seek(0)
        return super()._save(name, content)

简而言之,我们在保存文件之前先查找文件的开头。