【发布时间】:2013-10-23 11:01:43
【问题描述】:
我的 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 标头中的等号已更改为 %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)
但这不会更改 Amazon S3 管理控制台中显示的元数据。
(更新。The documentation for S3 metadata说
上传对象后,您无法修改对象元数据。修改对象元数据的唯一方法是复制对象并设置元数据。有关更多信息,请转到 Amazon Simple Storage Service API 参考中的 PUT 对象 - 复制。您可以使用 Amazon S3 管理控制台更新对象元数据,但在内部它会生成一个对象副本来替换现有对象以设置元数据。
所以也许我不能设置元数据也就不足为奇了。我假设get_metadata 仅在首先创建数据时使用。
结束更新)
所以我的问题是,首先,我是否可以配置 django-storages 以便它首先正确创建 cache-control 标头,其次,使用 set_metadata 设置的元数据与使用 S3 查看的元数据相同管理控制台,如果不是,后者是什么以及如何以编程方式设置它?
【问题讨论】: