Я сделал несколько разных изменений в settings.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'
Документы на компрессор
Это решение выше сохраняло файлы локально, а также загружало их вs3.Это позволило мне сжать файлы в автономном режиме.Если вы не распаковываете файлы, вышеприведенное должно работать для обслуживания сжатых файлов из CloudFront.
Добавление gzip добавляет складку:
settings.py
AWS_IS_GZIPPED = True
это приводило к ошибке всякий раз, когда сжимаемый файл (css и js в соответствии с хранилищами) был помещен в s3 во время collectstatic:
AttributeError: 'cStringIO.StringO' объект не имеет атрибута 'name'
Это произошло из-за какой-то странной ошибки, связанной с сжатием файлов css / js, которую я не понимаю.Эти файлы мне нужны локально, разархивированы, а не на s3, поэтому я мог бы вообще избежать этой проблемы, если настроил подкласс хранения, упомянутый выше (и предоставленный в компрессоре docs ).
new 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' #from the docs (linked below)
STATICFILES_STORAGE = 'example_app.storage.StaticToS3Storage'
И это все, что мне нужноскажи об этом.