2015-01-04 4 views
2

내 응용 프로그램의 종속성을 최신 상태로 유지하는 중입니다.Boto, Pipeline 및 Storages의 최신 버전에서 collectstatic을 사용할 때 x-amz-acl이 잘못 설정되었습니다.

  • BOTO : 2.34.0
  • 장고 - 파이프 라인으로 업그레이드 : 1.4.2로 업그레이드
  • 장고-필요합니다 업그레이드 1.0.6
  • 에 나는 requirements.txt 다음 변경을 장고 - 스토리지 : 있었다 최근에 (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/tmpDyVin1not a valid value for x-amz-acl이기 때문에 놀랄 일이 아닙니다.

이슈는 BOTO을 결합 정적 파일을 처리하기 위해 내 자신의 클래스를 지정에서 유래 필요하고, 파이프 라인 :

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 

이것은 이전 버전의 al과 완벽하고 일관되게 작동했습니다. 이 모듈들. 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)

그래서, 문제는 파이프 라인이 아래로 전파하고 acl을하게됩니다 첫 번째 인수로 location에 전달하는 것입니다.

답변

2

이 고약한 문제에 대한 해결책은 PipelineMixin을 내 사용자 정의 저장소 클래스의 인수 목록 끝으로 이동하는 것일 수도 있지만 r.js 최적화 프로그램은 중단됩니다. 해결책은이 PIPELINE_ENABLED 플래그를 True으로 설정하는 것입니다.

은 (문서는 this flag defaults to not settings.DEBUG를 말한다, 그러나 그것은 사용자의 환경에 의미있는 종속되지 않을 수 있습니다. 플래그는 1.4 만, it's not documented in the directives for upgrading to 1.4까지 PipelineMixin이 방법을 사용하지 않았습니다.)