Cleaned up the settings documentation and the docs frontpage.

This commit is contained in:
Jannis Leidel
2011-12-15 00:07:16 +01:00
parent 898199f05a
commit 78df87d733
6 changed files with 338 additions and 336 deletions

View File

@@ -79,8 +79,8 @@ v1.1
manifest.json file).
You can now easily run the :ref:`compress <pre-compression>` management
command locally and transfer the :ref:`COMPRESS_ROOT <compress_root>` dir
to your server.
command locally and transfer the :attr:`~django.conf.settings.COMPRESS_ROOT`
dir to your server.
- Updated installation instructions to properly mention all dependencies,
even those internally used.
@@ -257,7 +257,7 @@ Major improvements and a lot of bugfixes, some of which are:
- New precompilation support, which allows compilation of files and
hunks with easily configurable compilers before calling the actual
output filters. See the
:ref:`COMPRESS_PRECOMPILERS <compress_precompilers>` for more details.
:attr:`~django.conf.settings.COMPRESS_PRECOMPILERS` for more details.
- New staticfiles support. With the introduction of the staticfiles app
to Django 1.3, compressor officially supports finding the files to
@@ -272,7 +272,7 @@ Major improvements and a lot of bugfixes, some of which are:
- Various perfomance improvements by better caching and mtime cheking.
- Deprecated ``COMPRESS_LESSC_BINARY`` setting because it's now
superseded by the :ref:`COMPRESS_PRECOMPILERS <compress_precompilers>`
superseded by the :attr:`~django.conf.settings.COMPRESS_PRECOMPILERS`
setting. Just make sure to use the correct mimetype when linking to less
files or adding inline code and add the following to your settings::

View File

@@ -33,7 +33,7 @@ Contents
========
.. toctree::
:maxdepth: 1
:maxdepth: 2
installation
usage

View File

@@ -1,5 +1,8 @@
Quickstart
==========
Installation
============
------------
* Install Django Compressor with your favorite Python package manager::
@@ -18,7 +21,9 @@ Installation
* In case you use Django 1.3's staticfiles_ contrib app (or its standalone
counterpart django-staticfiles_) you have to add Django Compressor's file
finder to the ``STATICFILES_FINDERS`` setting, for example with
``django.contrib.staticfiles``::
``django.contrib.staticfiles``:
.. code-block:: python
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
@@ -35,60 +40,64 @@ Installation
Dependencies
------------
django-appconf_ (required)
^^^^^^^^^^^^^^^^^^^^^^^^^^
Required
^^^^^^^^
In case you're installing Django Compressor differently
(e.g. from the Git repo), make sure to install the following
dependencies.
- django-appconf_
Used internally to handle Django's settings, this is
automatically installed when following the above
installation instructions. In case you're installing
Django Compressor differently, make sure to install
it, e.g.::
installation instructions.
pip install django-appconf
versiontools_ (required)
^^^^^^^^^^^^^^^^^^^^^^^^
- versiontools_
Used internally to handle versions better, this is
automatically installed when following the above
installation instructions. In case you're installing
Django Compressor differently, make sure to install
it, e.g.::
installation instructions.
In case you're installing Django Compressor differently
(e.g. from the Git repo), make sure to install it, e.g.::
pip install versiontools
BeautifulSoup_ (optional)
^^^^^^^^^^^^^^^^^^^^^^^^^
Optional
^^^^^^^^
for the :ref:`parser <compress_parser>`
- BeautifulSoup_
For the :attr:`parser <django.conf.settings.COMPRESS_PARSER>`
``compressor.parser.BeautifulSoupParser`` and
``compressor.parser.LxmlParser``::
pip install BeautifulSoup<=4.0
lxml_ (optional)
^^^^^^^^^^^^^^^^
- lxml_
for the :ref:`parser <compress_parser>` ``compressor.parser.LxmlParser``,
also requires libxml2_::
For the :attr:`parser <django.conf.settings.COMPRESS_PARSER>`
``compressor.parser.LxmlParser``, also requires libxml2_::
STATIC_DEPS=true pip install lxml
html5lib_ (optional)
^^^^^^^^^^^^^^^^^^^^
- html5lib_
for the :ref:`parser <compress_parser>` ``compressor.parser.Html5LibParser``::
For the :attr:`parser <django.conf.settings.COMPRESS_PARSER>`
``compressor.parser.Html5LibParser``::
pip install html5lib
`Slim It`_ (optional)
^^^^^^^^^^^^^^^^^^^^^
- `Slim It`_
for the :ref:`Slim It filter <slimit_filter>` ``compressor.filters.jsmin.SlimItFilter``::
For the :ref:`Slim It filter <slimit_filter>`
``compressor.filters.jsmin.SlimItFilter``::
pip install slimit
.. _BeautifulSoup: http://www.crummy.com/software/BeautifulSoup/
.. _lxml: http://codespeak.net/lxml/
.. _libxml2: http://xmlsoft.org/

View File

@@ -9,9 +9,12 @@ 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
:ref:`set the storage backend <compress_storage>` that saves the result to a
remote service.
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`_. Some required settings are::
@@ -43,7 +46,7 @@ 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 :ref:`COMPRESS_ROOT <compress_root>` and STATIC_ROOT_
#. 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.
@@ -68,13 +71,14 @@ integrated.
self.local_storage._save(name, content)
return name
#. Set your :ref:`COMPRESS_STORAGE <compress_storage>` and STATICFILES_STORAGE_
#. 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 :ref:`COMPRESS_URL <compress_url>`
(e.g. ``"http://compressor-test.s3.amazon.com/"``).
STATIC_URL_ setting to the same value as
:attr:`~django.conf.settings.COMPRESS_URL` (e.g.
``"http://compressor-test.s3.amazon.com/"``).
.. _CDN: http://en.wikipedia.org/wiki/Content_delivery_network
.. _Amazon S3: https://s3.amazonaws.com/

View File

@@ -1,25 +1,28 @@
.. _settings:
Settings
--------
========
.. currentmodule:: django.conf.settings
Django Compressor has a number of settings that control its behavior.
They've been given sensible defaults.
.. _compress_enabled:
Base settings
-------------
COMPRESS_ENABLED
^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_ENABLED
:Default: the opposite of ``DEBUG``
:default: the opposite of ``DEBUG``
Boolean that decides if compression will happen. To test compression
when ``DEBUG`` is ``True`` COMPRESS_ENABLED_ must also be set to ``True``.
when ``DEBUG`` is ``True`` ``COMPRESS_ENABLED`` must also be set to
``True``.
When COMPRESS_ENABLED_ is ``False`` the input will be rendered without any
compression except for code with a mimetype matching one listed in the
COMPRESS_PRECOMPILERS_ setting. These matching files are still passed to the
precompiler before rendering.
When ``COMPRESS_ENABLED`` is ``False`` the input will be rendered without
any compression except for code with a mimetype matching one listed in the
:attr:`~django.conf.settings.COMPRESS_PRECOMPILERS` setting. These
matching files are still passed to the precompiler before rendering.
An example for some javascript and coffeescript.
@@ -32,18 +35,13 @@ An example for some javascript and coffeescript.
<script type="text/coffeescript" charset="utf-8" src="/static/js/awesome.coffee" />
{% endcompress %}
With COMPRESS_ENABLED_ set to ``False`` this would give you something like
this::
With ``COMPRESS_ENABLED`` set to ``False`` this would give you something
like this::
<script type="text/javascript" src="/static/js/site-base.js"></script>
<script type="text/javascript" src="/static/CACHE/js/8dd1a2872443.js" charset="utf-8"></script>
.. _compress_url:
COMPRESS_URL
^^^^^^^^^^^^
.. attribute:: COMPRESS_URL
:Default: ``STATIC_URL`` (``MEDIA_URL`` for older Django versions)
@@ -55,15 +53,13 @@ will be written to.
This setting defaults to ``MEDIA_URL`` in case ``STATIC_URL``
is not given or empty, e.g. on older Django versions (< 1.3).
.. _compress_root:
COMPRESS_ROOT
^^^^^^^^^^^^^
.. attribute:: COMPRESS_ROOT
:Default: ``STATIC_ROOT`` (``MEDIA_ROOT`` for older Django versions)
Controls the absolute file path that linked static will be read from and
compressed static will be written to when using the default COMPRESS_STORAGE_
compressed static will be written to when using the default
:attr:`~django.conf.settings.COMPRESS_STORAGE`
``compressor.storage.CompressorFileStorage``.
.. note::
@@ -71,65 +67,69 @@ compressed static will be written to when using the default COMPRESS_STORAGE_
This setting defaults to ``MEDIA_ROOT`` in case ``STATIC_ROOT``
is not given, e.g. on older Django versions (< 1.3).
COMPRESS_OUTPUT_DIR
^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_OUTPUT_DIR
:Default: ``'CACHE'``
Controls the directory inside COMPRESS_ROOT_ that compressed files will
be written to.
Controls the directory inside :attr:`~django.conf.settings.COMPRESS_ROOT`
that compressed files will be written to.
.. _compress_css_filters:
Backend settings
----------------
COMPRESS_CSS_FILTERS
^^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_CSS_FILTERS
:Default: ``['compressor.filters.css_default.CssAbsoluteFilter']``
:default: ``['compressor.filters.css_default.CssAbsoluteFilter']``
A list of filters that will be applied to CSS.
Possible options are:
Possible options are (including their settings):
``compressor.filters.css_default.CssAbsoluteFilter``
""""""""""""""""""""""""""""""""""""""""""""""""""""
- ``compressor.filters.css_default.CssAbsoluteFilter``
A filter that normalizes the URLs used in ``url()`` CSS statements.
- ``COMPRESS_CSS_HASHING_METHOD`` -- The method to use when calculating
the hash to append to processed URLs. Either ``'mtime'`` (default) or
``'content'``. Use the latter in case you're using multiple server to
serve your static files.
.. attribute:: COMPRESS_CSS_HASHING_METHOD
``compressor.filters.csstidy.CSSTidyFilter``
""""""""""""""""""""""""""""""""""""""""""""
The method to use when calculating the hash to append to
processed URLs. Either ``'mtime'`` (default) or ``'content'``.
Use the latter in case you're using multiple server to serve your
static files.
- ``compressor.filters.csstidy.CSSTidyFilter``
A filter that passes the CSS content to the CSSTidy_ tool.
- ``COMPRESS_CSSTIDY_BINARY`` -- The CSSTidy binary filesystem path.
.. attribute:: COMPRESS_CSSTIDY_BINARY
- ``COMPRESS_CSSTIDY_ARGUMENTS`` -- The arguments passed to CSSTidy.
The CSSTidy binary filesystem path.
``compressor.filters.datauri.DataUriFilter``
""""""""""""""""""""""""""""""""""""""""""""
.. attribute:: COMPRESS_CSSTIDY_ARGUMENTS
The arguments passed to CSSTidy.
- ``compressor.filters.datauri.DataUriFilter``
A filter for embedding media as `data: URIs`_ in the CSS.
- ``COMPRESS_DATA_URI_MAX_SIZE`` -- Only files that are smaller than
this value will be embedded. In bytes.
.. attribute:: COMPRESS_DATA_URI_MAX_SIZE
``compressor.filters.yui.YUICSSFilter``
"""""""""""""""""""""""""""""""""""""""
Only files that are smaller than this in bytes value will be embedded.
- ``compressor.filters.yui.YUICSSFilter``
A filter that passes the CSS content to the `YUI compressor`_.
- ``COMPRESS_YUI_BINARY`` -- The YUI compressor filesystem path. Make sure
to also prepend this setting with ``java -jar`` if you use that kind of
distribution.
.. attribute:: COMPRESS_YUI_BINARY
- ``COMPRESS_YUI_CSS_ARGUMENTS``-- The arguments passed to the compressor.
The YUI compressor filesystem path. Make sure to also prepend this
setting with ``java -jar`` if you use that kind of distribution.
``compressor.filters.cssmin.CSSMinFilter``
""""""""""""""""""""""""""""""""""""""""""
.. attribute:: COMPRESS_YUI_CSS_ARGUMENTS
The arguments passed to the compressor.
- ``compressor.filters.cssmin.CSSMinFilter``
A filter that uses Zachary Voase's Python port of the YUI CSS compression
algorithm cssmin_.
@@ -140,54 +140,57 @@ algorithm cssmin_.
.. _compress_js_filters:
COMPRESS_JS_FILTERS
^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_JS_FILTERS
:Default: ``['compressor.filters.jsmin.JSMinFilter']``
A list of filters that will be applied to javascript. Possible options are:
A list of filters that will be applied to javascript.
``compressor.filters.jsmin.JSMinFilter``
"""""""""""""""""""""""""""""""""""""""""
Possible options are:
A filter that uses the jsmin implementation rJSmin_ to compress JavaScript code.
- ``compressor.filters.jsmin.JSMinFilter``
A filter that uses the jsmin implementation rJSmin_ to compress
JavaScript code.
.. _slimit_filter:
``compressor.filters.jsmin.SlimItFilter``
"""""""""""""""""""""""""""""""""""""""""
- ``compressor.filters.jsmin.SlimItFilter``
A filter that uses the jsmin implementation `Slim It`_ to compress JavaScript code.
A filter that uses the jsmin implementation `Slim It`_ to compress
JavaScript code.
``compressor.filters.closure.ClosureCompilerFilter``
""""""""""""""""""""""""""""""""""""""""""""""""""""
- ``compressor.filters.closure.ClosureCompilerFilter``
A filter that uses `Google Closure compiler`_.
- ``COMPRESS_CLOSURE_COMPILER_BINARY`` -- The Closure compiler filesystem
path. Make sure to also prepend this setting with ``java -jar`` if you
use that kind of distribution.
.. attribute:: COMPRESS_CLOSURE_COMPILER_BINARY
- ``COMPRESS_CLOSURE_COMPILER_ARGUMENTS`` -- The arguments passed to the compiler.
The Closure compiler filesystem path. Make sure to also prepend
this setting with ``java -jar`` if you use that kind of distribution.
``compressor.filters.yui.YUIJSFilter``
""""""""""""""""""""""""""""""""""""""
.. attribute:: COMPRESS_CLOSURE_COMPILER_ARGUMENTS
The arguments passed to the compiler.
- ``compressor.filters.yui.YUIJSFilter``
A filter that passes the JavaScript code to the `YUI compressor`_.
- ``COMPRESS_YUI_BINARY`` -- The YUI compressor filesystem path.
.. attribute:: COMPRESS_YUI_BINARY
- ``COMPRESS_YUI_JS_ARGUMENTS`` -- The arguments passed to the compressor.
The YUI compressor filesystem path.
.. attribute:: COMPRESS_YUI_JS_ARGUMENTS
The arguments passed to the compressor.
.. _rJSmin: http://opensource.perlig.de/rjsmin/
.. _`Google Closure compiler`: http://code.google.com/closure/compiler/
.. _`YUI compressor`: http://developer.yahoo.com/yui/compressor/
.. _`Slim It`: http://slimit.org/
.. _compress_precompilers:
COMPRESS_PRECOMPILERS
^^^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_PRECOMPILERS
:Default: ``()``
@@ -257,10 +260,7 @@ Which would be rendered something like::
.. _less: http://lesscss.org/
.. _CoffeeScript: http://jashkenas.github.com/coffee-script/
.. _compress_storage:
COMPRESS_STORAGE
^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_STORAGE
:Default: ``'compressor.storage.CompressorFileStorage'``
@@ -274,10 +274,7 @@ Django Compressor ships with one additional storage backend:
A subclass of the default storage backend, which will additionally
create ``*.gz`` files of each of the compressed files.
.. _compress_parser:
COMPRESS_PARSER
^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_PARSER
:Default: ``'compressor.parser.AutoSelectParser'``
@@ -310,10 +307,10 @@ The backends included in Django Compressor:
See :ref:`dependencies` for more info about the packages you need
for each parser.
.. _compress_cache_backend:
Caching settings
----------------
COMPRESS_CACHE_BACKEND
^^^^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_CACHE_BACKEND
:Default: ``"default"`` or ``CACHE_BACKEND``
@@ -328,33 +325,31 @@ configured in your ``CACHES`` setting.
If you have not set ``CACHES`` and are using the old ``CACHE_BACKEND``
setting, ``COMPRESS_CACHE_BACKEND`` defaults to the ``CACHE_BACKEND`` setting.
COMPRESS_REBUILD_TIMEOUT
^^^^^^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_REBUILD_TIMEOUT
:Default: ``2592000`` (30 days in seconds)
The period of time after which the compressed files are rebuilt even if
no file changes are detected.
COMPRESS_MINT_DELAY
^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_MINT_DELAY
:Default: ``30`` (seconds)
The upper bound on how long any compression should take to run. Prevents
dog piling, should be a lot smaller than COMPRESS_REBUILD_TIMEOUT_.
dog piling, should be a lot smaller than
:attr:`~django.conf.settings.COMPRESS_REBUILD_TIMEOUT`.
COMPRESS_MTIME_DELAY
^^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_MTIME_DELAY
:Default: ``10``
The amount of time (in seconds) to cache the modification timestamp of a
file. Disabled by default. Should be smaller than COMPRESS_REBUILD_TIMEOUT_
and COMPRESS_MINT_DELAY_.
file. Disabled by default. Should be smaller than
:attr:`django.conf.settings.COMPRESS_REBUILD_TIMEOUT` and
:attr:`django.conf.settings.COMPRESS_MINT_DELAY`.
COMPRESS_DEBUG_TOGGLE
^^^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_DEBUG_TOGGLE
:Default: None
@@ -377,10 +372,10 @@ Compressor from performing the actual compression. Only useful for debugging.
.. _RequestContext: http://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.RequestContext
.. _compress_offline:
Offline settings
----------------
COMPRESS_OFFLINE
^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_OFFLINE
:Default: ``False``
@@ -389,10 +384,7 @@ request/response loop -- independent from user requests. This allows to
pre-compress CSS and JavaScript files and works just like the automatic
compression with the ``{% compress %}`` tag.
.. _compress_offline_timeout:
COMPRESS_OFFLINE_TIMEOUT
^^^^^^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_OFFLINE_TIMEOUT
:Default: ``31536000`` (1 year in seconds)
@@ -400,10 +392,7 @@ The period of time with which the ``compress`` management command stores
the pre-compressed the contents of ``{% compress %}`` template tags in
the cache.
.. _compress_offline_context:
COMPRESS_OFFLINE_CONTEXT
^^^^^^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_OFFLINE_CONTEXT
:Default: ``{'MEDIA_URL': settings.MEDIA_URL}``
@@ -413,10 +402,7 @@ offline cache.
If available, the ``STATIC_URL`` setting is also added to the context.
.. _compress_offline_manifest:
COMPRESS_OFFLINE_MANIFEST
^^^^^^^^^^^^^^^^^^^^^^^^^
.. attribute:: COMPRESS_OFFLINE_MANIFEST
:Default: ``manifest.json``

View File

@@ -46,21 +46,24 @@ Which would be rendered something like:
<script type="text/javascript" src="/static/CACHE/js/3f33b9146e12.js" charset="utf-8"></script>
Linked files **must** be accessible via :ref:`COMPRESS_URL <compress_url>`.
Linked files **must** be accessible via
:attr:`~django.conf.settings.COMPRESS_URL`.
If the :ref:`COMPRESS_ENABLED <compress_enabled>` setting is ``False``
If the :attr:`~django.conf.settings.COMPRESS_ENABLED` setting is ``False``
(defaults to the opposite of DEBUG) the ``compress`` template tag does nothing
and simply returns exactly what it was given.
.. note::
If you've configured any :ref:`precompilers <compress_precompilers>`
setting :ref:`COMPRESS_ENABLED <compress_enabled>` to ``False`` won't
If you've configured any
:attr:`precompilers <django.conf.settings.COMPRESS_PRECOMPILERS>`
setting :attr:`~django.conf.settings.COMPRESS_ENABLED` to ``False`` won't
affect the processing of those files. Only the
:ref:`CSS <compress_css_filters>` and
:ref:`JavaScript filters <compress_js_filters>` will be disabled.
:attr:`CSS <django.conf.settings.COMPRESS_CSS_FILTERS>` and
:attr:`JavaScript filters <django.conf.settings.COMPRESS_JS_FILTERS>`
will be disabled.
If both DEBUG and :ref:`COMPRESS_ENABLED <compress_enabled>` are set to
If both DEBUG and :attr:`~django.conf.settings.COMPRESS_ENABLED` are set to
``True``, incompressible files (off-site or non existent) will throw an
exception. If DEBUG is ``False`` these files will be silently stripped.
@@ -69,7 +72,7 @@ exception. If DEBUG is ``False`` these files will be silently stripped.
For production sites it is **strongly recommended** to use a real cache
backend such as memcached_ to speed up the checks of compressed files.
Make sure you set your Django cache backend appropriately (also see
:ref:`COMPRESS_CACHE_BACKEND <compress_cache_backend>` and
:attr:`~django.conf.settings.COMPRESS_CACHE_BACKEND` and
Django's `caching documentation`_).
The compress template tag supports a second argument specifying the output
@@ -112,7 +115,7 @@ works just like the automatic compression with the ``{% compress %}`` tag.
To compress the files "offline" and update the offline cache you have
to use the ``compress`` management command, ideally during deployment.
Also make sure to enable the :ref:`COMPRESS_OFFLINE <compress_offline>`
Also make sure to enable the :attr:`django.conf.settings.COMPRESS_OFFLINE`
setting. In case you don't use the ``compress`` management command, Django
Compressor will automatically fallback to the automatic compression using
the template tag.
@@ -120,7 +123,7 @@ the template tag.
The command parses all templates that can be found with the template
loader (as specified in the TEMPLATE_LOADERS_ setting) and looks for
``{% compress %}`` blocks. It then will use the context as defined in
:ref:`COMPRESS_OFFLINE_CONTEXT <compress_offline_context>` to render its
:attr:`django.conf.settings.COMPRESS_OFFLINE_CONTEXT` to render its
content. So if you use any variables inside the ``{% compress %}`` blocks,
make sure to list all values you require in ``COMPRESS_OFFLINE_CONTEXT``.
It's similar to a template context and should be used if a variable is used
@@ -146,8 +149,8 @@ the commonly used setting to refer to saved files ``MEDIA_URL`` and
``STATIC_URL`` (if specified in the settings).
The result of running the ``compress`` management command will be cached
in a file called ``manifest.json`` using the :ref:`configured storage
<compress_storage>` to be able to be transfered from your developement
in a file called ``manifest.json`` using the :attr:`configured storage
<django.conf.settings.COMPRESS_STORAGE>` to be able to be transfered from your developement
computer to the server easily.
.. _TEMPLATE_LOADERS: http://docs.djangoproject.com/en/dev/ref/settings/#template-loaders