我的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
除了我在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 Reference中的PUT Object - Copy。您可以使用Amazon S3管理控制台更新对象元数据,但在内部它会使对象副本替换现有对象以设置元数据。
所以也许我不能设置元数据也就不足为奇了。我假设get_metadata
仅在首先创建数据时使用。
结束更新)
所以我的问题是,首先,我可以配置django-storage,以便它首先正确创建cache-control
标头,其次,是与set_metadata
相同的元数据集。使用S3管理控制台查看元数据,如果不是后者,我该如何以编程方式设置它?
答案 0 :(得分:6)
使用ASCII字符串作为值为我解决了这个问题。
AWS_HEADERS = {'Cache-Control': str('public, max-age=15552000')}
答案 1 :(得分: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。
中测试的答案 2 :(得分:0)
cache_control是key的属性,不是元数据的一部分。
因此,要为存储桶中的所有对象设置缓存控制,您可以执行以下操作:
s3_conn = S3Connection(AWS_KEY, AWS_SECRET)
bucket = s3_conn.get_bucket(AWS_BUCKET_NAME)
bucket.make_public()
for key in bucket.list():
key = bucket.get_key(key.name)
key.cache_control = 'max-age=%d, public' % (3600 * 24 * 360 * 2)
print key.name + ' ' + key.cache_control