Dopo this guide e questi [1][2] post, ho provato a configurare l'archiviazione statica su AWS S3 utilizzando django-storages Boto.Django AWS S3 che utilizza Boto con Compressor non riesce a comprimere UncompressableFileError
Quando si esegue collectstatic
, il comando si accumula con successo su STATIC_ROOT
. Tuttavia, i file non vengono caricati su S3 compressi e il server non può servirli. Viene restituito un errore 500. Guardando i registri: Messaggio
Errore:
UncompressableFileError: 'https://<myapp>.s3.amazonaws.com/static/oscar/css/styles.css' could not be found in the COMPRESS_ROOT '/var/www/<myappname>/static' or with staticfiles.
EDIT:
ho anche cambiato STATIC_URL a http://%s/ % AWS_S3_CUSTOM_DOMAIN
, e ottengo lo stesso errore, se non che è ancora alla ricerca a https
, ma COMPRESS_URL è http
.
UncompressableFileError: 'https://<myappname>.s3.amazonaws.com/static/oscar/css/styles.css' isn't accessible via COMPRESS_URL ('http://<myappname>.s3.amazonaws.com/') and can't be compressed
È questa un'incompatibilità con compressore e Boto?
Codice in materia:
# settings/prod.py
AWS_ACCESS_KEY_ID = <Key_ID>
AWS_SECRET_ACCESS_KEY = <Secret_Key>
AWS_STORAGE_BUCKET_NAME = "<my_bucket_name>"
AWS_S3_CUSTOM_DOMAIN = "%s.s3.amazonaws.com" % AWS_STORAGE_BUCKET_NAME
STATIC_URL = "https://%s/" % AWS_S3_CUSTOM_DOMAIN
AWS_LOCATION = 'static'
DEFAULT_FILE_STORAGE = "storages.backends.s3boto.S3BotoStorage"
STATICFILES_STORAGE = "myapp.storage.s3utils.CachedS3BotoStorage"
COMPRESS_STORAGE = "myapp.storage.s3utils.CachedS3BotoStorage"
AWS_IS_GZIPPED = True
COMPRESS_URL = STATIC_URL
STATIC_ROOT = "/var/www/<myappname>/static/"
COMPRESS_ROOT = STATIC_ROOT
stoccaggio/s3utils.py da
from django.core.files.storage import get_storage_class
from storages.backends.s3boto import S3BotoStorage
class CachedS3BotoStorage(S3BotoStorage):
"""
S3 storage backend that saves the files locally, too.
"""
def __init__(self, *args, **kwargs):
super(CachedS3BotoStorage, self).__init__(*args, **kwargs)
self.local_storage = get_storage_class(
"compressor.storage.CompressorFileStorage")()
def save(self, name, content):
name = super(CachedS3BotoStorage, self).save(name, content)
self.local_storage._save(name, content)
return name
È possibile eseguire il comando collectstatic con --traceback che può dare un po 'più in dettaglio su ciò che sta andando male. Ricordo però di avere diversi problemi con il compressore. Se hai intenzione di utilizzare il cloudfront con questo, tieni presente che le impostazioni di CORS sono molto molto dolorose per essere corrette in AWS. – Paul