Skip to content

Commit

Permalink
[1.5.x] Fixed #6195 -- Documented caching options for javascript_cata…
Browse files Browse the repository at this point in the history
…log.

Backport of 0836670 from master
  • Loading branch information
aaugustin committed Feb 25, 2013
1 parent 33fc438 commit 1742fd0
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
2 changes: 1 addition & 1 deletion docs/topics/conditional-view-processing.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ instead of a full response, telling the client that nothing has changed.
When you need more fine-grained control you may use per-view conditional
processing functions.

.. conditional-decorators:
.. _conditional-decorators:

The ``condition`` decorator
===========================
Expand Down
46 changes: 46 additions & 0 deletions docs/topics/i18n/translation.txt
Original file line number Diff line number Diff line change
Expand Up @@ -918,6 +918,52 @@ This isn't as fast as string interpolation in Python, so keep it to those
cases where you really need it (for example, in conjunction with ``ngettext``
to produce proper pluralizations).

Note on performance
-------------------

The :func:`~django.views.i18n.javascript_catalog` view generates the catalog
from ``.mo`` files on every request. Since its output is constant — at least
for a given version of a site — it's a good candidate for caching.

Server-side caching will reduce CPU load. It's easily implemented with the
:func:`~django.views.decorators.cache.cache_page` decorator. To trigger cache
invalidation when your translations change, provide a version-dependant key
prefix, as shown in the example below, or map the view at a version-dependant
URL.

.. code-block:: python

from django.views.decorators.cache import cache_page
from django.views.i18n import javascript_catalog

# The value returned by get_version() must change when translations change.
@cache_page(86400, key_prefix='js18n-%s' % get_version())
def cached_javascript_catalog(request, domain='djangojs', packages=None):
return javascript_catalog(request, domain, packages)

Client-side caching will save bandwidth and make your site load faster. If
you're using ETags (:setting:`USE_ETAGS = True <USE_ETAGS>`), you're already
covered. Otherwise, you can apply :ref:`conditional decorators
<conditional-decorators>`. In the following example, the cache is invalidated
whenever your restart your application server.

.. code-block:: python

from django.utils import timezone
from django.views.decorators.http import last_modified
from django.views.i18n import javascript_catalog

last_modified_date = timezone.now()
@last_modified(lambda req, **kw: last_modified_date)
def cached_javascript_catalog(request, domain='djangojs', packages=None):
return javascript_catalog(request, domain, packages)

You can even pre-generate the javascript catalog as part of your deployment
procedure and serve it as a static file. This radical technique is implemented
in django-statici18n_.

.. _django-statici18n: http://django-statici18n.readthedocs.org/en/latest/

.. _url-internationalization:

Internationalization: in URL patterns
Expand Down

0 comments on commit 1742fd0

Please sign in to comment.