deb-python-django-compressor/docs/remote-storages.txt
Briggs Thompson 90b29b3072 Updating remote storages documentation for CachedS3BotoStorage bug.
The example in the docs doesn't quite work as the file stored in
the "content" variable is already closed, and ends up spitting out
encoded data to the destination files. It was properly being sent
to S3, but not getting saved locally.

This saves the file locally first, then using local storage, opens
the file once again for the S3BotoStorage save call.
2016-03-07 21:37:27 -06:00

90 lines
3.6 KiB
Plaintext

.. _remote_storages:
Remote storages
---------------
In some cases it's useful to use a CDN_ for serving static files such as
those generated by Django Compressor. Due to the way Django Compressor
processes files, it requires the files to be processed (in the
``{% compress %}`` block) to be available in a local file system cache.
Django Compressor provides hooks to automatically have compressed files
pushed to a remote storage backend. Simply set the storage backend
that saves the result to a remote service (see
:attr:`~django.conf.settings.COMPRESS_STORAGE`).
django-storages
^^^^^^^^^^^^^^^
So assuming your CDN is `Amazon S3`_, you can use the boto_ storage backend
from the 3rd party app `django-storages-redux`_. Some required settings are::
AWS_ACCESS_KEY_ID = 'XXXXXXXXXXXXXXXXXXXXX'
AWS_SECRET_ACCESS_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
AWS_STORAGE_BUCKET_NAME = 'compressor-test'
Next, you need to specify the new CDN base URL and update the URLs to the
files in your templates which you want to compress::
COMPRESS_URL = "http://compressor-test.s3.amazonaws.com/"
.. note::
For staticfiles just set ``STATIC_URL = COMPRESS_URL``
The storage backend to save the compressed files needs to be changed, too::
COMPRESS_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
Using staticfiles
^^^^^^^^^^^^^^^^^
If you are using Django's staticfiles_ contrib app, you'll need to use a
temporary filesystem cache for Django Compressor to know which files to
compress. Since staticfiles provides a management command to collect static
files from various locations which uses a storage backend, this is where both
apps can be integrated.
#. Make sure the :attr:`~django.conf.settings.COMPRESS_ROOT` and STATIC_ROOT_
settings are equal since both apps need to look at the same directories
when to do their job.
#. You need to create a subclass of the remote storage backend you want
to use; below is an example of the boto S3 storage backend from
django-storages-redux_::
from django.core.files.storage import get_storage_class
from storages.backends.s3boto import S3BotoStorage
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):
self.local_storage._save(name, content)
super(CachedS3BotoStorage, self).save(name, self.local_storage._open(name))
return name
#. Set your :attr:`~django.conf.settings.COMPRESS_STORAGE` and STATICFILES_STORAGE_
settings to the dotted path of your custom cached storage backend, e.g.
``'mysite.storage.CachedS3BotoStorage'``.
#. To have Django correctly render the URLs to your static files, set the
STATIC_URL_ setting to the same value as
:attr:`~django.conf.settings.COMPRESS_URL` (e.g.
``"http://compressor-test.s3.amazonaws.com/"``).
.. _CDN: http://en.wikipedia.org/wiki/Content_delivery_network
.. _Amazon S3: https://s3.amazonaws.com/
.. _boto: http://boto.cloudhackers.com/
.. _django-storages-redux: http://github.com/jschneier/django-storages
.. _staticfiles: http://docs.djangoproject.com/en/dev/howto/static-files/
.. _STATIC_ROOT: http://docs.djangoproject.com/en/dev/ref/settings/#static-root
.. _STATIC_URL: http://docs.djangoproject.com/en/dev/ref/settings/#static-url
.. _STATICFILES_STORAGE: http://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-storage