我對settings.py做了一些不同的修改.py
AWS_S3_CUSTOM_DOMAIN = 'XXXXXXX.cloudfront.net' #important: no "http://"
AWS_S3_SECURE_URLS = True #default, but must set to false if using an alias on cloudfront
COMPRESS_STORAGE = 'example_app.storage.CachedS3BotoStorage' #from the docs (linked below)
STATICFILES_STORAGE = 'example_app.storage.CachedS3BotoStorage'
Compressor Docs
以上解決方案將文件保存在本地以及將其上傳到s3。這讓我離線壓縮文件。如果您不是gzip,則上述內容應適用於從CloudFront提供壓縮文件。
gzip的添加增加了皺紋:
settings.py
AWS_IS_GZIPPED = True
儘管這導致錯誤每當可壓縮文件(CSS和JS根據存儲器)中的溶液被推動期間collectstatic至S3:
AttributeError: 'cStringIO.StringO' object has no attribute '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,所以我創建另一個sublcass壓縮機的使用方法:
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' #from the docs (linked below)
STATICFILES_STORAGE = 'example_app.storage.StaticToS3Storage'
,這是所有我要說的就是這些。
看到了你的票在github上......你是否介意發佈您的解決方案? – Jiaaro 2012-01-17 01:41:07
對於沒有及時看到這件事,我表示誠摯的歉意,明天我會在明天下發布我的解決方案(希望) – 2012-01-19 02:17:16