How to setup django-compressor on heroku, offline compression to S3 How to setup django-compressor on heroku, offline compression to S3 heroku heroku

How to setup django-compressor on heroku, offline compression to S3


On my side I have very similar config, and I'm successfully using compressor for more than 2 years.

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 = FalseAWS_QUERYSTRING_AUTH = FalseCOMPRESS_ROOT = 'MyAwesomeApp/static'STATIC_ROOT = 'MyAwesomeApp/static/javascript'COMPRESS_OUTPUT_DIR = 'compressed'STATICFILES_STORAGE = COMPRESS_STORAGESTATIC_URL = "http://myAmazonS3cdn.myawesomewebsite.com/"COMPRESS_URL = STATIC_URLCOMPRESS_ENABLED = True

CachedS3BotoStorage.py

from django.core.files.storage import get_storage_classfrom storages.backends.s3boto import S3BotoStoragefrom django.core.files.base import Fileclass 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

I'm running python managep.py compress locally, and having manifest generated on my static files directory. Heroku only deals with the collecstatic and delivers the most recent manifest version to my cdn.

Regards,


I completed the above solution with some lines, to fix the problem that create many (multiples) manifest_%.json in Amazon S3

in setting.py:

STATICFILES_STORAGE = 'your_package.s3utils.CachedS3BotoStorage'

in s3utils.py:

from storages.backends.s3boto import S3BotoStoragefrom django.core.files.storage import get_storage_classclass 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


I found a git repository that contains post_compile hooks to solve this problem. It runs compress after Heroku built the Django app (and also installs lessc if you need less in your compressor settings).

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