我的Django项目使用django_compressor通过django-storages软件包通过boto在S3存储区中存储JavaScript和CSS文件。使用boto时为Amazon S3密钥设置cache-cotrol标题
Django的-存储器相关的配置包括
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)
但显示在亚马逊S3管理控制台这不会改变的元数据。
(更新。The documentation for S3 metadata说
你上传的对象后,您不能修改对象元数据。修改对象元数据的唯一方法是使该对象的副本,并设置的元数据。欲了解更多您可以使用Amazon S3管理控制台更新对象元数据,但在内部使用对象副本替换现有对象以设置元数据。
因此,也许这并不奇怪,我无法设置元数据。我认为get_metadata
仅在首先创建数据时使用。
末更新)
所以我的问题是,第一,我可以配置Django的存储器,使其在第一时间正确地创建cache-control
头,二是set_metadata
相同的元数据集作为用S3管理控制台查看的元数据,如果不是后者是什么,以及如何以编程方式设置它?
我试过了,它修复了这个问题。 – pdc
你可以加一个更完整的例子吗?我猜目前在哪里粘贴你的解决方案。 –
有关更正确的示例,我无法正确格式化... ' 'Cache-Control':'max-age = 604800',#60 x 60 x 24 x 7 = 1周 '内容 - 类型':CONTENT_TYPE, } K =密钥(self.get_bucket()) k.key =文件名 k.set_contents_from_string(contents.getvalue(),标头) 如果self.public:K .make_public() ' 为我工作。看到我下面的完整答案... –