s3boto3storage - django storages s3
¿Cómo configurar django-compressor y django-staticfiles con Amazon''s S3? (4)
Estoy intentando configurar django-compressor y django-staticfiles para que el CSS comprimido / Javascript y las imágenes se django-staticfiles desde el S3 de Amazon.
He logrado configurar archivos estáticos usando S3 como back-end, por lo que su comando collectstatic
envía los archivos a S3 en lugar de a STATIC_ROOT
.
Sin embargo, cuando intento agregar django-compressor
a la mezcla es donde todo parece derrumbarse para mí. Siguiendo la documentation sobre la configuración de almacenamientos remotos, creé una subclase del backend de almacenamiento, boto , así que copié el example a storage.py
. Una vez que empiezo a utilizar este backend en caché, los archivos se copian en static_media y no en S3. Después de cargar la primera página, la carpeta CACHE aparece en S3 y en la carpeta static_media.
Al establecer STATICFILES_STORAGE
y COMPRESS_STORAGE
en la clase S3 normal de boto ( storages.backends.s3boto.S3BotoStorage
) los activos estáticos se recopilan en el depósito S3 y no en la carpeta static_media. Sin embargo, intentar volver a cargar la página arroja el error:
Caught NotImplementedError while rendering: This backend doesn''t support absolute paths.
destacando {% compress css %}
como etiqueta y compressor/base.py
como origen.
La sección s3 / staticfiles / compressor de mi settings.py
:
DEFAULT_FILE_STORAGE = ''storages.backends.s3boto.S3BotoStorage''
AWS_ACCESS_KEY_ID = ''key''
AWS_SECRET_ACCESS_KEY =''secret''
AWS_STORAGE_BUCKET_NAME = ''my-bucket''
S3_URL = ''http://my-bucket.s3.amazonaws.com/''
MEDIA_ROOT = ''client_media''
MEDIA_URL = ''/media/''
STATIC_ROOT = ''static_media''
STATIC_URL = S3_URL
ADMIN_MEDIA_PREFIX = S3_URL + ''admin/''
STATICFILES_DIRS = (
join(DIRNAME, ''static''),
)
STATICFILES_FINDERS = (
''django.contrib.staticfiles.finders.FileSystemFinder'',
''django.contrib.staticfiles.finders.AppDirectoriesFinder'',
''compressor.finders.CompressorFinder'',
)
COMPRESS_ENABLED = True
COMPRESS_URL = S3_URL
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_STORAGE = ''storage.CachedS3BotoStorage''
STATICFILES_STORAGE = COMPRESS_STORAGE
Entonces, ¿dónde me estoy equivocando? ¿He configurado mal algo cuando uso el almacenamiento personalizado de CachedS3BotoStorage
?
Después de muchos días de arduo trabajo e investigación, finalmente pude hacer esto y decidí escribir una guía detallada sobre el tema, que incluía cómo protegerlos también con gzip.
Básicamente, debes hacer algunas cosas:
- Use
AWS_IS_GZIPPED = True
- Si su S3 está fuera de los EE. UU. Necesita crear una clase
S3Connection
personalizada donde anule la variableDefaultHost
a su url S3. Ejemplos3-eu-west-1.amazonaws.com
- Si está utilizando un nombre de cubo con puntos, ejemplo
subdomain.domain.tld
. Necesita configurarAWS_S3_CALLING_FORMAT = ''boto.s3.connection.OrdinaryCallingFormat''
- Debes establecer
non_gzipped_file_content = content.file
en tuCachedS3BotoStorage
Esta es la clase CachedS3BotoStorage
que necesita:
class CachedS3BotoStorage(S3BotoStorage):
"""
S3 storage backend that saves the files locally, too.
"""
connection_class = EUConnection
location = settings.STATICFILES_LOCATION
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):
non_gzipped_file_content = content.file
name = super(CachedS3BotoStorage, self).save(name, content)
content.file = non_gzipped_file_content
self.local_storage._save(name, content)
return name
Tenga en cuenta que EUConnection
es una clase personalizada en la que configuro DefaultHost
en mi ubicación S3. Consulte la guía mucho más larga y detallada para los almacenamientos personalizados completos y settings.py
Pruebe esta publicación que completa la solución anterior con algunas líneas, para solucionar el problema que crea muchos (múltiples) manifiestos _%. Json en Amazon S3. https://.com/a/31545361/1359475
Tu configuración parece correcta. Debería mantener tanto STATICFILES_STORAGE
como COMPRESS_STORAGE
establecidos en storage.CachedS3BotoStorage
y no volver a los storages.backends.s3boto.S3BotoStorage
.
Según this django-compressor, el problema está en la forma en que django-staticfiles guarda durante el proceso shutil.copy2
(usando shutil.copy2
). Este problema se corrigió en la versión más reciente de django-staticfiles , que se puede usar en lugar de la que se envía con Django 1.3.
pip install django-staticfiles==dev
Y en su settings.py
, cambie a la versión actualizada:
STATICFILES_FINDERS = (
#"django.contrib.staticfiles.finders.FileSystemFinder",
#"django.contrib.staticfiles.finders.AppDirectoriesFinder",
"staticfiles.finders.FileSystemFinder",
"staticfiles.finders.AppDirectoriesFinder",
"compressor.finders.CompressorFinder",
)
INSTALLED_APPS = (
''django.contrib.auth'',
''django.contrib.contenttypes'',
''django.contrib.sessions'',
#''django.contrib.staticfiles'',
''staticfiles'',
#...
)
Después de ejecutar python manage.py collectstatic
nuevamente, tanto el directorio CACHE de django-compressor como los archivos staticfiles recopilados deberían aparecer en S3.
Usar django_compressor==1.2
funcionó para mí. No estoy seguro de por qué necesita instalar django-staticfiles; sin embargo, todas las versiones de django_compressor
excepto 1.2 tienen ese problema.