storages s3boto3storage default_file_storage cloudfront django amazon-s3 django-staticfiles django-compressor

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:

  1. Use AWS_IS_GZIPPED = True
  2. Si su S3 está fuera de los EE. UU. Necesita crear una clase S3Connection personalizada donde anule la variable DefaultHost a su url S3. Ejemplo s3-eu-west-1.amazonaws.com
  3. Si está utilizando un nombre de cubo con puntos, ejemplo subdomain.domain.tld . Necesita configurar AWS_S3_CALLING_FORMAT = ''boto.s3.connection.OrdinaryCallingFormat''
  4. Debes establecer non_gzipped_file_content = content.file en tu CachedS3BotoStorage

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.