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).
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