Ho apportato alcune modifiche diverse a 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
Questa soluzione precedente ha salvato i file localmente e li ha caricati su s3. Questo mi consente di comprimere i file offline. Se non stai facendo il gzipping, quanto sopra dovrebbe funzionare per servire file compressi da CloudFront.
Aggiunta gzip aggiunge una grinza:
settings.py
AWS_IS_GZIPPED = True
se questo ha determinato un errore quando un file comprimibile (css e js secondo stoccaggi) veniva spinto a s3 durante collectstatic:
AttributeError: 'cStringIO.StringO' object has no attribute 'name'
Questo è stato a causa di qualche errore bizzarro hanno a che fare con la compressione dei file js/css che non capisco. Questi file mi servono localmente, decompressi e non su s3, così potrei evitare del tutto il problema se modificherò la sottoclasse di memorizzazione di cui sopra (e fornita nel compressore docs).
nuovo 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
Questo poi salvati tutti i css e js (esclusi i file di amministrazione, che che servo non compresso da CloudFront) mentre si spinge il resto dei file da S3 (e non preoccuparsi di salvarli localmente, anche se potrebbe facilmente aggiungere la linea self.local_storage._save).
Ma quando corro impacco, voglio che i miei js compressi e file css per ottenere spinto a s3 così creo un'altra sublcass per compressore da utilizzare:
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
Infine, date queste nuove sottoclassi, ho è necessario aggiornare alcune impostazioni:
COMPRESS_STORAGE = 'example_app.storage.CachedS3BotoStorage' #from the docs (linked below)
STATICFILES_STORAGE = 'example_app.storage.StaticToS3Storage'
E questo è tutto ciò che ho da dire al riguardo.
visto il tuo biglietto su github ... ti dispiacerebbe pubblicare la tua soluzione? – Jiaaro
Le mie scuse sincere per non averlo visto prima, pubblicherò la mia soluzione in basso domani (si spera) –