Merge pull request #770 from karyon/clarify_offline_compression

Clarify offline compression
This commit is contained in:
karyon
2016-06-01 21:57:08 +02:00
6 changed files with 48 additions and 48 deletions

View File

@@ -1,6 +1,6 @@
.. _behind_the_scenes: .. _behind_the_scenes:
Behind the scenes Behind the Scenes
================= =================
This document assumes you already have an up and running instance of This document assumes you already have an up and running instance of
@@ -8,25 +8,25 @@ Django Compressor, and that you understand how to use it in your templates.
The goal is to explain what the main template tag, {% compress %}, does The goal is to explain what the main template tag, {% compress %}, does
behind the scenes, to help you debug performance problems for instance. behind the scenes, to help you debug performance problems for instance.
Offline cache Offline compression
------------- -------------
If offline cache is activated, the first thing {% compress %} tries to do is If offline compression is activated, the {% compress %} tag will try to
retrieve the compressed version for its nodelist from the offline manifest retrieve the compressed version for its nodelist from the offline manifest
cache. It doesn't parse, doesn't check the modified times of the files, doesn't cache. It doesn't parse, doesn't check the modified times of the files, doesn't
even know which files are concerned actually, since it doesn't look inside the even know which files are concerned actually, since it doesn't look inside the
nodelist of the template block enclosed by the ``compress`` template tag. nodelist of the template block enclosed by the ``compress`` template tag.
The offline cache manifest is just a json file, stored on disk inside the The offline cache manifest is just a json file, stored on disk inside the
directory that holds the compressed files. The format of the manifest is simply directory that holds the compressed files. The format of the manifest is simply
a key <=> value dictionary, with the hash of the nodelist being the key, a key-value dictionary, with the hash of the nodelist being the key,
and the HTML containing the element code for the combined file or piece of code and the HTML containing the element code for the combined file or piece of code
being the value. Generating the offline manifest, using the ``compress`` being the value. The ``compress`` management command generates the
management command, also generates the combined files referenced in the manifest. offline manifest as well as the combined files referenced in the manifest.
If offline cache is activated and the nodelist hash can not be found inside the If offline compression is enabled and the nodelist hash can not be found inside the
manifest, {% compress %} will raise an ``OfflineGenerationError``. manifest, {% compress %} will raise an ``OfflineGenerationError``.
If offline cache is de-activated, the following happens: If offline compression is disabled, the following happens:
First step: parsing and file list First step: parsing and file list
--------------------------------- ---------------------------------

View File

@@ -1,10 +1,11 @@
Jinja2 In-Request Support Jinja2 Support
========================= ==============
Django Compressor comes with support for Jinja2_ via an extension. Django Compressor comes with support for Jinja2_ via an extension.
Plain Jinja2
------------ In-Request Compression
----------------------
In order to use Django Compressor's Jinja2 extension we would need to pass In order to use Django Compressor's Jinja2 extension we would need to pass
``compressor.contrib.jinja2ext.CompressorExtension`` into environment:: ``compressor.contrib.jinja2ext.CompressorExtension`` into environment::
@@ -25,20 +26,21 @@ From now on, you can use same code you'd normally use within Django templates::
template.render({'STATIC_URL': settings.STATIC_URL}) template.render({'STATIC_URL': settings.STATIC_URL})
Jinja2 Offline Compression Support Offline Compression
================================== -------------------
You'd need to configure ``COMPRESS_JINJA2_GET_ENVIRONMENT`` so that
Usage
^^^^^
First, you will need to configure ``COMPRESS_JINJA2_GET_ENVIRONMENT`` so that
Compressor can retrieve the Jinja2 environment for rendering. Compressor can retrieve the Jinja2 environment for rendering.
This can be a lambda or function that returns a Jinja2 environment. This can be a lambda or function that returns a Jinja2 environment.
Usage Then, run the following compress command along with an ``--engine`` parameter.
----- The parameter can be either jinja2 or django (default). For example,
Run the following compress command along with an ``--engine`` parameter. The
parameter can be either jinja2 or django (default). For example,
``./manage.py compress --engine jinja2``. ``./manage.py compress --engine jinja2``.
Using both Django and Jinja2 templates Using both Django and Jinja2 templates
-------------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
There may be a chance that the Jinja2 parser is used to parse Django templates There may be a chance that the Jinja2 parser is used to parse Django templates
if you have a mixture of Django and Jinja2 templates in the same location(s). if you have a mixture of Django and Jinja2 templates in the same location(s).
This should not be a problem since the Jinja2 parser will likely raise a This should not be a problem since the Jinja2 parser will likely raise a
@@ -56,7 +58,7 @@ However, it is still recommended that you do not mix Django and Jinja2
templates in the same project. templates in the same project.
Limitations Limitations
----------- ^^^^^^^^^^^
- Does not support ``{% import %}`` and similar blocks within - Does not support ``{% import %}`` and similar blocks within
``{% compress %}`` blocks. ``{% compress %}`` blocks.
- Does not support ``{{super()}}``. - Does not support ``{{super()}}``.
@@ -65,7 +67,7 @@ Limitations
should run fine. should run fine.
Jinja2 templates location Jinja2 templates location
------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^
IMPORTANT: For Compressor to discover the templates for offline compression, IMPORTANT: For Compressor to discover the templates for offline compression,
there must be a template loader that implements the ``get_template_sources`` there must be a template loader that implements the ``get_template_sources``
method, and is in the ``TEMPLATE_LOADERS`` setting. method, and is in the ``TEMPLATE_LOADERS`` setting.
@@ -86,7 +88,7 @@ the filesystem loader (``django.template.loaders.filesystem.Loader``) in the
``TEMPLATE_DIRS`` setting. ``TEMPLATE_DIRS`` setting.
Using your custom loader Using your custom loader
------------------------ ^^^^^^^^^^^^^^^^^^^^^^^^
You should configure ``TEMPLATE_LOADERS`` as such:: You should configure ``TEMPLATE_LOADERS`` as such::
TEMPLATE_LOADERS = ( TEMPLATE_LOADERS = (

View File

@@ -1,6 +1,6 @@
.. _remote_storages: .. _remote_storages:
Remote storages Remote Storages
--------------- ---------------
In some cases it's useful to use a CDN_ for serving static files such as In some cases it's useful to use a CDN_ for serving static files such as

View File

@@ -47,6 +47,8 @@ You will find offline compression beneficial if:
* You store compressed files on a CDN. * You store compressed files on a CDN.
* You want the best possible performance.
Caveats Caveats
------- -------

View File

@@ -459,9 +459,7 @@ Offline settings
:Default: ``False`` :Default: ``False``
Boolean that decides if compression should be done outside of the Boolean that decides if compression should be done outside of the
request/response loop. (See :ref:`behind_the_Scenes` for more.) This allows request/response loop. See :ref:`offline_compression` for details.
to pre-compress CSS and JavaScript files and works just like the automatic
compression with the ``{% compress %}`` tag.
.. attribute:: COMPRESS_OFFLINE_TIMEOUT .. attribute:: COMPRESS_OFFLINE_TIMEOUT

View File

@@ -107,22 +107,22 @@ access it in the `post_compress signal <signals>`.
.. _memcached: http://memcached.org/ .. _memcached: http://memcached.org/
.. _caching documentation: https://docs.djangoproject.com/en/1.8/topics/cache/#memcached .. _caching documentation: https://docs.djangoproject.com/en/1.8/topics/cache/#memcached
.. _pre-compression:
Pre-compression .. _offline_compression:
Offline Compression
--------------- ---------------
Django Compressor comes with an optional ``compress`` management command to Django Compressor has the ability to run the compression "offline",
run the compression outside of the request/response loop -- independent i.e. outside of the request/response loop -- independent from user requests.
from user requests. This allows to pre-compress CSS and JavaScript files and If offline compression is enabled, no new files are generated during a request
works just like the automatic compression with the ``{% compress %}`` tag. and the ``{% compress %}`` tag simply inserts links to the files in the
offline cache (see :ref:`behind_the_scenes` for details). This results in better
performance and enables certain deployment scenarios (see :ref:`scenarios`).
To compress the files "offline" and update the offline cache you have To use offline compression, enable the :attr:`django.conf.settings.COMPRESS_OFFLINE`
to use the ``compress`` management command, ideally during deployment. setting and then run the ``compress`` management command to compress your assets
Also make sure to enable the :attr:`django.conf.settings.COMPRESS_OFFLINE` and update the offline cache.
setting. In case you don't use the ``compress`` management command, Django
Compressor will automatically fallback to the automatic compression using
the template tag.
The command parses all templates that can be found with the template The command parses all templates that can be found with the template
loader (as specified in the TEMPLATE_LOADERS_ setting) and looks for loader (as specified in the TEMPLATE_LOADERS_ setting) and looks for
@@ -137,20 +137,18 @@ in the blocks, e.g.:
{% load compress %} {% load compress %}
{% compress js %} {% compress js %}
<script src="{{ path_to_files }}js/one.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript">
alert("{{ greeting }}");
</script>
{% endcompress %} {% endcompress %}
Since this template requires a variable (``path_to_files``) you need to Since this template requires a variable (``greeting``) you need to specify
specify this in your settings before using the ``compress`` management this in your settings before using the ``compress`` management command::
command::
COMPRESS_OFFLINE_CONTEXT = { COMPRESS_OFFLINE_CONTEXT = {
'path_to_files': '/static/js/', 'greeting': 'Hello there!',
} }
If not specified, the ``COMPRESS_OFFLINE_CONTEXT`` will by default contain
the commonly used setting to refer to saved files ``STATIC_URL``.
The result of running the ``compress`` management command will be cached The result of running the ``compress`` management command will be cached
in a file called ``manifest.json`` using the :attr:`configured storage in a file called ``manifest.json`` using the :attr:`configured storage
<django.conf.settings.COMPRESS_STORAGE>` to be able to be transferred from your development <django.conf.settings.COMPRESS_STORAGE>` to be able to be transferred from your development