我对settings.py做了几个不同的更改。
AWS_S3_CUSTOM_DOMAIN = 'XXXXXXX.cloudfront.net'
AWS_S3_SECURE_URLS = True
COMPRESS_STORAGE = 'example_app.storage.CachedS3BotoStorage'
STATICFILES_STORAGE = 'example_app.storage.CachedS3BotoStorage'
压缩器文档
上述解决方案不仅可以将文件保存在本地,还可以将其上传到s3。这使我可以离线压缩文件。如果您没有使用gzip,则上述方法应该适用于从CloudFront提供压缩文件。
添加gzip会增加一些复杂性:
settings.py
AWS_IS_GZIPPED = True
尽管这样做会导致在collectstatic期间将可压缩文件(根据存储,包括css和js)推送到s3时出现错误:
AttributeError: 'cStringIO.StringO'对象没有属性'name'
这是由于某些与压缩css/js文件有关的奇怪错误造成的,我不理解。我需要这些文件在本地解压缩,而不是在s3上,因此,如果我调整上面提到的存储子类(并提供压缩器
docs中),就可以完全避免这个问题。
新的storage.py
from os.path import splitext
from django.core.files.storage import get_storage_class
from storages.backends.s3boto import S3BotoStorage
class StaticToS3Storage(S3BotoStorage):
def __init__(self, *args, **kwargs):
super(StaticToS3Storage, self).__init__(*args, **kwargs)
self.local_storage = get_storage_class('compressor.storage.CompressorFileStorage')()
def save(self, name, content):
ext = splitext(name)[1]
parent_dir = name.split('/')[0]
if ext in ['.css', '.js'] and not parent_dir == 'admin':
self.local_storage._save(name, content)
else:
filename = super(StaticToS3Storage, self).save(name, content)
return filename
这个操作将保存所有的.css和.js文件(不包括管理文件,我从CloudFront未压缩地提供),同时将其余文件推送到s3(不必在本地保存,但可以轻松添加self.local_storage._save行)。
但是当我运行压缩时,我希望我的压缩后的.js和.css文件被推送到s3,因此我创建了另一个子类供压缩器使用:
class CachedS3BotoStorage(S3BotoStorage):
"""
django-compressor uses this class to gzip the compressed files and send them to s3
these files are then saved locally, which ensures that they only create fresh copies
when they need to
"""
def __init__(self, *args, **kwargs):
super(CachedS3BotoStorage, self).__init__(*args, **kwargs)
self.local_storage = get_storage_class('compressor.storage.CompressorFileStorage')()
def save(self, filename, content):
filename = super(CachedS3BotoStorage, self).save(filename, content)
self.local_storage._save(filename, content)
return filename
最后,鉴于这些新的子类,我需要更新一些设置:
COMPRESS_STORAGE = 'example_app.storage.CachedS3BotoStorage'
STATICFILES_STORAGE = 'example_app.storage.StaticToS3Storage'
“关于这个,我所要说的就是这些了。”