compressor django heroku amazon-s3 django-compressor

Cómo configurar django-compressor en heroku, compresión fuera de línea a S3



django compressor css (3)

Por mi parte, tengo una configuración muy similar, y estoy usando con éxito el compresor durante más de 2 años.

settings.py

COMPRESS_STORAGE = ''MyAwesomeApp.app.CachedS3BotoStorage.CachedS3BotoStorage'' AWS_ACCESS_KEY_ID = ''#######'' AWS_SECRET_ACCESS_KEY = ''########################+#########+BqoQ'' AWS_STORAGE_BUCKET_NAME = ''myAmazonS3cdn.myawesomewebsite.com'' AWS_S3_SECURE_URLS = False AWS_QUERYSTRING_AUTH = False COMPRESS_ROOT = ''MyAwesomeApp/static'' STATIC_ROOT = ''MyAwesomeApp/static/javascript'' COMPRESS_OUTPUT_DIR = ''compressed'' STATICFILES_STORAGE = COMPRESS_STORAGE STATIC_URL = "http://myAmazonS3cdn.myawesomewebsite.com/" COMPRESS_URL = STATIC_URL COMPRESS_ENABLED = True

CachedS3BotoStorage.py

from django.core.files.storage import get_storage_class from storages.backends.s3boto import S3BotoStorage from django.core.files.base import File 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

Estoy ejecutando la compresión de python managep.py localmente y generando manifiesto en mi directorio de archivos estáticos. Heroku solo trata con el recopilatorio y entrega la versión de manifiesto más reciente a mi cdn.

Saludos,

Seguí todas las sugerencias de QA encontradas en SO y en diferentes blogs. Todo funciona bien en mi máquina de desarrollo y nada funciona en heroku.

aquí están mis configuraciones:

DEFAULT_FILE_STORAGE = ''arena.utils.MediaRootS3BotoStorage'' # media files # storage AWS_ACCESS_KEY_ID = os.environ.get(''AWS_ACCESS_KEY_ID'') AWS_SECRET_ACCESS_KEY = os.environ.get(''AWS_SECRET_ACCESS_KEY'') AWS_STORAGE_BUCKET_NAME = os.environ.get(''AWS_STORAGE_BUCKET_NAME'') AWS_PRELOAD_METADATA = True # necessary to fix manage.py collectstatic command to only upload changed files instead of all files S3_URL = ''https://%s.s3.amazonaws.com'' % AWS_STORAGE_BUCKET_NAME MEDIA_URL = S3_URL + ''/media/'' STATIC_URL = S3_URL + ''/static/'' ADMIN_MEDIA_PREFIX = STATIC_URL + ''admin/'' COMPRESS_URL = STATIC_URL COMPRESS_OFFLINE = True COMPRESS_STORAGE = ''utils.CachedS3BotoStorage'' STATICFILES_STORAGE = COMPRESS_STORAGE

Cuando ejecuto collectstatic / compress todo está bien, veo los archivos que se están recogiendo en S3 y los coloco en los lugares apropiados. Veo el archivo manifiesto.

Cargando cualquier página con etiqueta de compresor, muestre un error OfflineGenerationError: You have offline compression enabled but key "d2a53169c44dec41ce3ee7da19b2b9d4" is missing from offline manifest. Ejecutar python manage.py compress nuevamente no resuelve nada. cuando miro el archivo de manifiesto, de hecho, la clave que busca no existe.

¿Qué está mal aquí?

Pregunta que ya revisé:

¿Cómo configurar django-compressor y django-staticfiles con Amazon''s S3?

Compresor Django con S3 URL Heroku

Configuración de django-compressor con almacenamiento remoto (django-storage - amazon s3)


Encontré un repositorio git que contiene ganchos post_compile para resolver este problema. Se ejecuta comprimir después de Heroku construyó la aplicación Django (y también instala lessc si necesita menos en la configuración de su compresor).

https://github.com/nigma/heroku-django-cookbook


Completé la solución anterior con algunas líneas para solucionar el problema que crea muchos (múltiples) manifiestos _%. Json en Amazon S3

en setting.py:

STATICFILES_STORAGE = ''your_package.s3utils.CachedS3BotoStorage''

en s3utils.py:

from storages.backends.s3boto import S3BotoStorage from django.core.files.storage import get_storage_class class CachedS3BotoStorage(S3BotoStorage): """ S3 storage backend that saves the files locally, too. """ location = ''static'' def __init__(self, *args, **kwargs): super(CachedS3BotoStorage, self).__init__(*args, **kwargs) self.local_storage = get_storage_class( "compressor.storage.CompressorFileStorage")() def url(self, name): """ Fix problem images admin Django S3 images """ url = super(CachedS3BotoStorage, self).url(name) if name.endswith(''/'') and not url.endswith(''/''): url += ''/'' return url def save(self, name, content): name = super(CachedS3BotoStorage, self).save(name, content) self.local_storage._save(name, content) return name # HERE is secret to dont generating multiple manifest.json and to delete manifest.json in Amazon S3 def get_available_name(self, name): if self.exists(name): self.delete(name) return name