summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2016-09-03 09:06:33 -0400
committerGitHub <noreply@github.com>2016-09-03 09:06:33 -0400
commit277fe2e8f2ee35cd389b079ce7691491bb5738ec (patch)
tree22f68b9207297232dc65dccbd2c958ff19f89fa3
parent2ced2f785d5aca0354abf5841d5449b7a49509dc (diff)
Fixed #25788 -- Enabled the cached template loader if debug is False.
-rw-r--r--django/template/engine.py2
-rw-r--r--docs/ref/templates/api.txt38
-rw-r--r--docs/releases/1.11.txt6
-rw-r--r--tests/template_backends/test_django.py15
-rw-r--r--tests/template_loader/tests.py5
-rw-r--r--tests/template_tests/test_loaders.py2
6 files changed, 55 insertions, 13 deletions
diff --git a/django/template/engine.py b/django/template/engine.py
index b49ed09088..729c484a67 100644
--- a/django/template/engine.py
+++ b/django/template/engine.py
@@ -27,6 +27,8 @@ class Engine(object):
loaders = ['django.template.loaders.filesystem.Loader']
if app_dirs:
loaders += ['django.template.loaders.app_directories.Loader']
+ if not debug:
+ loaders = [('django.template.loaders.cached.Loader', loaders)]
else:
if app_dirs:
raise ImproperlyConfigured(
diff --git a/docs/ref/templates/api.txt b/docs/ref/templates/api.txt
index a6b029efe2..55a1a314b1 100644
--- a/docs/ref/templates/api.txt
+++ b/docs/ref/templates/api.txt
@@ -103,8 +103,16 @@ what's passed by :class:`~django.template.backends.django.DjangoTemplates`.
* ``'django.template.loaders.app_directories.Loader'`` if and only if
``app_dirs`` is ``True``.
+ If ``debug`` is ``False``, these loaders are wrapped in
+ :class:`django.template.loaders.cached.Loader`.
+
See :ref:`template-loaders` for details.
+ .. versionchanged:: 1.11
+
+ Enabling of the cached template loader when ``debug`` is ``False``
+ was added.
+
* ``string_if_invalid`` is the output, as a string, that the template
system should use for invalid (e.g. misspelled) variables.
@@ -899,18 +907,22 @@ loaders that come with Django:
.. class:: cached.Loader
- By default, the templating system will read and compile your templates every
- time they need to be rendered. While the Django templating system is quite
- fast, the overhead from reading and compiling templates can add up.
+ By default (when :setting:`DEBUG` is ``True``), the template system reads
+ and compiles your templates every time they're rendered. While the Django
+ template system is quite fast, the overhead from reading and compiling
+ templates can add up.
- The cached template loader is a class-based loader that you configure with
- a list of other loaders that it should wrap. The wrapped loaders are used to
- locate unknown templates when they are first encountered. The cached loader
- then stores the compiled ``Template`` in memory. The cached ``Template``
- instance is returned for subsequent requests to load the same template.
+ You configure the cached template loader with a list of other loaders that
+ it should wrap. The wrapped loaders are used to locate unknown templates
+ when they're first encountered. The cached loader then stores the compiled
+ ``Template`` in memory. The cached ``Template`` instance is returned for
+ subsequent requests to load the same template.
- For example, to enable template caching with the ``filesystem`` and
- ``app_directories`` template loaders you might use the following settings::
+ This loader is automatically enabled if :setting:`DEBUG` is ``False`` and
+ :setting:`OPTIONS['loaders'] <TEMPLATES-OPTIONS>` isn't specified.
+
+ You can also enable template caching with some custom template loaders
+ using settings like this::
TEMPLATES = [{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
@@ -920,6 +932,7 @@ loaders that come with Django:
('django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
+ 'path.to.custom.Loader',
]),
],
},
@@ -934,7 +947,10 @@ loaders that come with Django:
information, see :ref:`template tag thread safety considerations
<template_tag_thread_safety>`.
- This loader is disabled by default.
+ .. versionchanged:: 1.11
+
+ The automatic enabling of the cached template loader when ``debug`` is
+ ``False`` was added.
``django.template.loaders.locmem.Loader``
diff --git a/docs/releases/1.11.txt b/docs/releases/1.11.txt
index e45a64ffd5..bb8c851f72 100644
--- a/docs/releases/1.11.txt
+++ b/docs/releases/1.11.txt
@@ -471,6 +471,12 @@ Miscellaneous
:class:`~django.core.serializers.json.DjangoJSONEncoder` (renamed in Django
1.0) is removed.
+* The :class:`cached template loader <django.template.loaders.cached.Loader>`
+ is now enabled if :setting:`DEBUG` is ``False`` and
+ :setting:`OPTIONS['loaders'] <TEMPLATES-OPTIONS>` isn't specified. This could
+ be backwards-incompatible if you have some :ref:`template tags that aren't
+ thread safe <template_tag_thread_safety>`.
+
.. _deprecated-features-1.11:
Features deprecated in 1.11
diff --git a/tests/template_backends/test_django.py b/tests/template_backends/test_django.py
index 1a93a82274..a474b0765f 100644
--- a/tests/template_backends/test_django.py
+++ b/tests/template_backends/test_django.py
@@ -130,3 +130,18 @@ class DjangoTemplatesTests(TemplateStringsTests):
engines['django'].from_string('Hello, {{ name }}').render({'name': 'Bob & Jim'}),
'Hello, Bob &amp; Jim'
)
+
+ default_loaders = [
+ 'django.template.loaders.filesystem.Loader',
+ 'django.template.loaders.app_directories.Loader',
+ ]
+
+ @override_settings(DEBUG=False)
+ def test_non_debug_default_template_loaders(self):
+ engine = DjangoTemplates({'DIRS': [], 'APP_DIRS': True, 'NAME': 'django', 'OPTIONS': {}})
+ self.assertEqual(engine.engine.loaders, [('django.template.loaders.cached.Loader', self.default_loaders)])
+
+ @override_settings(DEBUG=True)
+ def test_debug_default_template_loaders(self):
+ engine = DjangoTemplates({'DIRS': [], 'APP_DIRS': True, 'NAME': 'django', 'OPTIONS': {}})
+ self.assertEqual(engine.engine.loaders, self.default_loaders)
diff --git a/tests/template_loader/tests.py b/tests/template_loader/tests.py
index 5e62574666..c3bb444175 100644
--- a/tests/template_loader/tests.py
+++ b/tests/template_loader/tests.py
@@ -11,11 +11,14 @@ from django.test.client import RequestFactory
'APP_DIRS': True,
}, {
'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
],
+ 'loaders': [
+ 'django.template.loaders.filesystem.Loader',
+ 'django.template.loaders.app_directories.Loader',
+ ]
},
}])
class TemplateLoaderTests(SimpleTestCase):
diff --git a/tests/template_tests/test_loaders.py b/tests/template_tests/test_loaders.py
index 1a1457142d..0cb1b9ee36 100644
--- a/tests/template_tests/test_loaders.py
+++ b/tests/template_tests/test_loaders.py
@@ -279,7 +279,7 @@ class FileSystemLoaderTests(SimpleTestCase):
@classmethod
def setUpClass(cls):
- cls.engine = Engine(dirs=[TEMPLATE_DIR])
+ cls.engine = Engine(dirs=[TEMPLATE_DIR], loaders=['django.template.loaders.filesystem.Loader'])
super(FileSystemLoaderTests, cls).setUpClass()
@contextmanager