collectstatic 在 S3 中错误地创建了多个 CSS 文件

collectstatic incorrectly creates multiple CSS files in S3

我已经将文件上传到 S3,与我的 Wagtail/django 应用程序(静态和上传)一起工作正常。现在我正在尝试使用 ManifestStaticFilesStorage 来启用缓存清除。应用程序正确生成了 url,并且文件正在使用哈希复制到 S3。

但每次我 运行 collectstatic 一些文件被复制到 S3 两次 - 每个都有不同的散列。到目前为止,所有 CSS 个文件都存在该问题。

file.a.css 由应用程序加载,是 staticfiles.json 中引用的文件 - 然而它在 S3 中是一个 20.0B 的文件(应该是 6.3KB)。

file.b.css 在 S3 中有正确的内容 - 但是它没有出现在 collectstatic.

生成的输出中
# custom_storages.py
from django.conf import settings
from django.contrib.staticfiles.storage import ManifestFilesMixin
from storages.backends.s3boto import S3BotoStorage


class CachedS3Storage(ManifestFilesMixin, S3BotoStorage):
    pass


class StaticStorage(CachedS3Storage):
    location = settings.STATICFILES_LOCATION


class MediaStorage(S3BotoStorage):
    location = settings.MEDIAFILES_LOCATION
    file_overwrite = False

部门:

"boto==2.47.0",
"boto3==1.4.4",
"django-storages==1.5.2"
"Django==2.0.8"

如果能提供任何有关查找此问题的位置的指示,我们将不胜感激! :)

编辑:

仔细查看复制到 S3 的所有文件,问题仅发生在 CSS 个文件中。

禁用将资产推送到 S3 并将它们写入本地文件系统按预期工作。

编辑 2:

已将所有部门更新到最新版本 - 与上述行为相同。

我最终在 django-storages issue tracker which then lead me to a very similar question on SO 中偶然发现了这个问题。

在这两个页面之间我设法解决了问题。我做了以下让 django-storages + ManifestStaticFilesStorage + S3 一起工作:

# custom_storages.py
from django.conf import settings
from django.contrib.staticfiles.storage import ManifestFilesMixin
from storages.backends.s3boto3 import S3Boto3Storage  # note boto3!!


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


class CachedS3Storage(ManifestFilesMixin, PatchedS3StaticStorage):
    pass


class StaticStorage(CachedS3Storage):
    location = settings.STATICFILES_LOCATION


class MediaStorage(S3Boto3Storage):
    location = settings.MEDIAFILES_LOCATION
    file_overwrite = False

请注意,我必须使用 boto3 才能使其正常工作 django-storages 必须 >= 1.5 才能使用 boto3。我删除了 boto 作为部门。我最后的部门是:

"boto3==1.4.4",
"django-storages==1.7.1"
"Django==2.0.8"