x-amz-acl установлен неправильно при использовании collectstatic с последней версией Boto, Pipeline и Storages

Я нахожусь в процессе обновления зависимостей моего приложения. Я внес следующие изменения в файл require.txt:

  • boto: обновлён до 2.34.0
  • Джанго-конвейер: обновлен до 1.4.2
  • django-require: повышен до 1.0.6
  • Джанго-хранилища: был на последнем (1.1.8)

Теперь, когда я пытаюсь запустить collectstatic в моей корзине S3, я получаю следующую ошибку:

boto.exception.S3ResponseError: S3ResponseError: 400 Bad Request

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidArgument</Code><Message></Message><ArgumentName>x-amz-acl</ArgumentName>
<ArgumentValue>/tmp/tmpDyVin1</ArgumentValue><RequestId>xxx</RequestId>
<HostId>yyy</HostId></Error>

Не удивлен, так как явно /tmp/tmpDyVin1 не является допустимым значением для x-amz-acl.

Проблемы связаны с указанием моего собственного класса для обработки статических файлов, который объединяет Boto, Require и Pipeline:

settings.py

STATICFILES_STORAGE = 'myapp.storage.OptimizedS3BotoStorage'

storage.py

from pipeline.storage import PipelineMixin
from require.storage import OptimizedFilesMixin
from storages.backends.s3boto import S3BotoStorage

class ReleaseVersionCachedFilesMixin(CachedFilesMixin):

    def hashed_name(self, name, content=None):
        ...

class OptimizedS3BotoStorage(PipelineMixin, OptimizedFilesMixin, ReleaseVersionCachedFilesMixin, S3BotoStorage):
    pass

Это прекрасно и согласованно работало со старыми версиями всех этих модулей. Копаясь в новом коде, я вижу, что проблема заключается во взаимодействии с этими тремя:

  • когда S3BotoStorage.__init__() называется, первый параметр, acl, передается в качестве значения этого каталога tmp. Это отменяет предыдущее значение public-read и приводит к проблеме выше.
  • это __init__() рутина вызывается CachedFilesMixin.__init__(), который получает args = ('/tmp/tmpnNUVD9',),
  • Тот __init__() называется PipelineMixin.__init__(), который делает это:

def __init__(self, location=None, *args, **kwargs): if not settings.PIPELINE_ENABLED and location is None: location = tempfile.mkdtemp() super(PipelineMixin, self).__init__(location, *args, **kwargs)

Итак, проблема в том, что Pipeline проходит в location в качестве первого аргумента, который распространяется вниз и становится acl,

1 ответ

Решение

Может показаться, что решение этой неприятной проблемы - просто переместить PipelineMixin в конец списка аргументов в моем пользовательском классе хранения, но это нарушает оптимизатор r.js. Решение состоит в том, чтобы установить это PIPELINE_ENABLED флаг для True,

(Документация говорит, что этот флаг по умолчаниюnot settings.DEBUG, но это не может быть значимой зависимостью для вашей среды. Флаг не использовался таким образом в PipelineMixin до 1.4, но это не описано в директивах по обновлению до 1.4.)

Другие вопросы по тегам