无法使用boto为Amazon S3密钥设置cache-cotrol标头

pdc*_*pdc 4 django amazon-s3 boto

我的Django项目使用django_compressor通过doto-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
Run Code Online (Sandbox Code Playgroud)

这样做除了当我访问S3管理控制台中的对象时,我看到Cache-Control标题中的等号已更改为%3D,如此max-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)
Run Code Online (Sandbox Code Playgroud)

但这不会更改Amazon S3管理控制台中显示的元数据.

(更新.对于S3元数据文件

上载对象后,无法修改对象元数据.修改对象元数据的唯一方法是制作对象的副本并设置元数据.有关更多信息,请转到Amazon Simple Storage Service API Reference中的PUT Object - Copy.您可以使用Amazon S3管理控制台更新对象元数据,但在内部它会使对象副本替换现有对象以设置元数据.

所以也许我不能设置元数据也就不足为奇了.我假设get_metadata仅在首先创建数据时使用.

结束更新)

所以我的问题是,首先,我可以配置django-storage,以便cache-control首先正确创建标头,其次,元数据集与set_metadata使用S3管理控制台查看的元数据相同,如果不是后者是什么以及如何以编程方式设置它?

Clo*_*eam 7

使用ASCII字符串作为值为我解决了这个问题.

AWS_HEADERS = {'Cache-Control': str('public, max-age=15552000')}
Run Code Online (Sandbox Code Playgroud)