collectstatic неправильно создает несколько файлов CSS в S3 - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть загрузка файлов на S3, работающая нормально с моим приложением Wagtail / django (как статическое, так и загрузка).Сейчас я пытаюсь использовать ManifestStaticFilesStorage для включения очистки кэша.URL-адреса корректно генерируются приложением, а файлы копируются с хэшами в S3.

Но каждый раз, когда я запускаю collectstatic, некоторые файлы дважды копируются в S3 - каждый со своим хэшем.Пока что проблема возникает для всех CSS-файлов.

file.a.css загружается приложением и является файлом, на который есть ссылка в staticfiles.json - однако это файл размером 20.0B в S3 (должен быть 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

Deps:

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

Буду признателен за любые указания, где искать эту проблему!:)

Редактировать:

При более внимательном рассмотрении всех файлов, скопированных на S3, проблема возникает ТОЛЬКО для файлов CSS.

Отключение отправки ресурсов на S3 и записи их в локальную файловую систему работает, как и ожидалось.

Редактировать 2:

Обновлены все deps до последней версии - то же поведение, что и выше.

1 Ответ

0 голосов
/ 14 сентября 2018

Я в конце концов наткнулся на эту проблему в django-storerages tracker, который затем привел меня к очень похожему вопросу о 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"
...