4

私の Django プロジェクトでは、django_compressor を使用して、django-storages パッケージを介して boto 経由で JavaScript および CSS ファイルを S3 バケットに保存します。

django-storages 関連の構成には以下が含まれます

if 'AWS_STORAGE_BUCKET_NAME' in os.environ:
    AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']
    AWS_HEADERS = {
        'Cache-Control': 'max-age=100000',
        'x-amz-acl': 'public-read',
    }
    AWS_QUERYSTRING_AUTH = False

    # This causes images to be stored in Amazon S3
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

    # This causes CSS and other static files to be served from S3 as well.
    STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
    STATIC_ROOT = ''
    STATIC_URL = 'https://{0}.s3.amazonaws.com/'.format(AWS_STORAGE_BUCKET_NAME)

    # This causes conpressed CSS and JavaScript to also go in S3
    COMPRESS_STORAGE = STATICFILES_STORAGE
    COMPRESS_URL = STATIC_URL

これは機能しますが、S3 管理コンソールでオブジェクトにアクセスすると、ヘッダーの等号が のようにCache-Controlに変更され%3Dmax-age%3D100000キャッシュが機能しなくなります。

これらの行に沿ってこれを修正しようとする小さなスクリプトを作成しました。

max_age = 30000000
cache_control = 'public, max-age={}'.format(max_age)

con = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
bucket = con.get_bucket(settings.AWS_STORAGE_BUCKET_NAME)
for key in bucket.list():
    key.set_metadata('Cache-Control', cache_control)

ただし、Amazon S3 管理コンソールに表示されるメタデータは変更されません。

(更新。S3 メタデータのドキュメントには、

オブジェクトをアップロードした後は、オブジェクトのメタデータを変更できません。オブジェクトのメタデータを変更する唯一の方法は、オブジェクトのコピーを作成してメタデータを設定することです。詳細については、Amazon Simple Storage Service API Reference の PUT オブジェクト - コピーを参照してください。Amazon S3 マネジメント コンソールを使用してオブジェクト メタデータを更新できますが、内部的には既存のオブジェクトを置き換えるオブジェクト コピーを作成してメタデータを設定します。

そのため、メタデータを設定できないことはそれほど驚くべきことではないかもしれません。get_metadata最初にデータを作成するときにのみ使用されると思います。

更新を終了します)

cache-controlしたがって、私の質問は、最初にヘッダーを正しく作成するようにdjango-storagesを構成できますか、2番目に、 set_metadataS3管理コンソールで表示されるメタデータと同じメタデータセットであり、そうでない場合は後者ですプログラムで設定するにはどうすればよいですか?

4

3 に答える 3

7

値としてASCII文字列を使用すると、これが解決されます。

AWS_HEADERS = {'Cache-Control': str('public, max-age=15552000')}
于 2013-12-07T10:49:18.303 に答える
1

ファイルのアップロード中にキャッシュ制御を追加したい場合....

 headers = {
    'Cache-Control':'max-age=604800', # 60 x 60 x 24 x 7 = 1 week
    'Content-Type':content_type,
  }

  k = Key(self.get_bucket())
  k.key = filename
  k.set_contents_from_string(contents.getvalue(), headers)
  if self.public: k.make_public()

既存のファイルにキャッシュ制御を追加したい場合...

for key in bucket.list():
  print key.name.encode('utf-8')
  metadata = key.metadata
  metadata['Cache-Control'] = 'max-age=604800' # 60 x 60 x 24 x 7 = 1 week
  key.copy(AWS_BUCKET, key, metadata=metadata, preserve_acl=True)

これは boto 2.32 - 2.40 でテストされています。

于 2016-06-08T23:53:46.557 に答える