Django 将collectstatic与最新版本的Boto、管道和存储一起使用时,x-amz-acl设置不正确

Django 将collectstatic与最新版本的Boto、管道和存储一起使用时,x-amz-acl设置不正确,django,boto,django-pipeline,collectstatic,Django,Boto,Django Pipeline,Collectstatic,我正在更新我的应用程序的依赖项。我对requirements.txt进行了以下更改: boto:升级到2.34.0 django管道:升级至1.4.2 django要求:升级到1.0.6 django storages:最新版本(1.1.8) 现在,当我尝试在S3存储桶中运行collectstatic时,我得到以下错误: boto.exception.S3ResponseError: S3ResponseError: 400 Bad Request <?xml version="1.

我正在更新我的应用程序的依赖项。我对requirements.txt进行了以下更改:

  • boto:升级到2.34.0
  • django管道:升级至1.4.2
  • django要求:升级到1.0.6
  • django storages:最新版本(1.1.8)
现在,当我尝试在S3存储桶中运行collectstatic时,我得到以下错误:

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

问题源于指定我自己的类来处理结合了Boto、Require和Pipeline的静态文件:

设置.py

STATICFILES_STORAGE = 'myapp.storage.OptimizedS3BotoStorage'
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
storage.py

STATICFILES_STORAGE = 'myapp.storage.OptimizedS3BotoStorage'
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.\uuuu init\uuuu()
    时,第一个参数
    acl
    作为此tmp目录的值传入。这会覆盖以前的
    公共读取值
    ,并导致上述问题
  • 这个
    \uuuu init\uuu()
    例程由
    CachedFileMixin.\uuuuu init\uuu()
    调用,它接收
    args=('/tmp/tmpnNUVD9',)
  • PipelineMixin.\uuu init\uuuuuuuuuuuu()
    调用该
    。\uuuuu init\uuuuuuuuu()
    ,它执行以下操作:

定义初始化(self,location=None,*args,**kwargs):
如果未启用settings.PIPELINE_且位置为None:
location=tempfile.mkdtemp()
super(PipelineMixin,self)。\uuuuu init\uuuuu(位置,*args,**kwargs)


因此,问题是管道作为第一个参数传入
位置
,它向下传播并成为
acl

,似乎解决这个看起来很糟糕的问题的方法只是将PipelineMixin移动到自定义存储类中参数列表的末尾,但这破坏了r.js优化器。解决方案是将此
管道_ENABLED
标志设置为
True

(文档中说,但这对您的环境来说可能不是一个有意义的依赖项。直到1.4版,该标志才在
PipelineMixin
中以这种方式使用,但是。)