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"
我已经将文件上传到 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"