アプリの依存関係を最新の状態に更新中です。requirements.txt に次の変更を加えました。
- boto: 2.34.0 にアップグレード
- django-pipeline: 1.4.2 にアップグレード
- django-require: 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>
明らかに x-amz-acl の有効な値で/tmp/tmpDyVin1
はないため、驚くことではありません。
この問題は、Boto、Require、Pipeline を組み合わせた静的ファイルを処理するための独自のクラスを指定したことに起因します。
設定.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
これは、これらすべてのモジュールの古いバージョンで完全かつ一貫して機能しました。新しいコードを掘り下げると、問題は次の 3 つの相互作用にあることがわかります。
- が
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
.