2

アプリの依存関係を最新の状態に更新中です。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.

4

1 に答える 1

2

この見苦しい問題の解決策は、PipelineMixin をカスタム ストレージ クラスの引数リストの末尾に移動することだけに思えるかもしれませんが、それによって r.js オプティマイザーが壊れてしまいます。解決策は、このPIPELINE_ENABLEDフラグをに設定することTrueです。

(ドキュメントによると、このフラグのデフォルトはnot settings.DEBUGですが、それは環境にとって意味のある依存関係ではない可能性があります。フラグはPipelineMixin1.4 までこのように使用されていませんでしたが、1.4 にアップグレードするためのディレクティブには記載されていません。)

于 2015-01-04T22:41:46.420 に答える