Hice algunos cambios diferentes en 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'
Compressor Docs
Esta solución anterior guarda los archivos localmente y los carga en s3. Esto me permite comprimir los archivos fuera de línea. Si no está comprimiendo gz, lo anterior debería funcionar para servir archivos comprimidos de CloudFront.
Adición de gzip añade una arruga:
settings.py
AWS_IS_GZIPPED = True
aunque esto dio como resultado un error siempre que un archivo compresible (css y js según almacenamientos) estaba siendo empujado a s3 durante collectstatic:
AttributeError: 'cStringIO.StringO' object has no attribute 'name'
Esto fue debido a algún error extraño tener que ver con la compresión de los archivos css/js que yo no entiendo. Estos archivos los necesito localmente, descomprimidos y no en s3, así que podría evitar el problema por completo si modifico la subclase de almacenamiento a la que se hizo referencia arriba (y se proporciona en el compresor docs).
nueva 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
Esto luego se guardan todos los archivos .css y .js (excluyendo los archivos de administración, que me sirven sin comprimir desde CloudFront) mientras empuja el resto de los archivos a S3 (y no molesto por guardarlos localmente, aunque podría agregar fácilmente la línea self.local_storage._save).
Pero cuando corro compresa, quiero que mi Js comprimidos y archivos .css a quedarse relegados a s3 así que crear otra sublcass para el compresor de empleo:
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
Por último, teniendo en cuenta estas nuevas subclases, me necesita actualizar algunas configuraciones:
COMPRESS_STORAGE = 'example_app.storage.CachedS3BotoStorage' #from the docs (linked below)
STATICFILES_STORAGE = 'example_app.storage.StaticToS3Storage'
Y eso es todo lo que tengo que decir al respecto.
vieron su boleto en github ... ¿le importaría publicar tu solución? – Jiaaro
Mis más sinceras disculpas por no haber visto esto antes, publicaré mi solución a continuación mañana (con suerte) –