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.)