Fixed #25788 -- Enabled the cached template loader if debug is False.

This commit is contained in:
Tim Graham 2016-09-03 09:06:33 -04:00 committed by GitHub
parent 2ced2f785d
commit 277fe2e8f2
6 changed files with 55 additions and 13 deletions

View File

@ -27,6 +27,8 @@ class Engine(object):
loaders = ['django.template.loaders.filesystem.Loader'] loaders = ['django.template.loaders.filesystem.Loader']
if app_dirs: if app_dirs:
loaders += ['django.template.loaders.app_directories.Loader'] loaders += ['django.template.loaders.app_directories.Loader']
if not debug:
loaders = [('django.template.loaders.cached.Loader', loaders)]
else: else:
if app_dirs: if app_dirs:
raise ImproperlyConfigured( raise ImproperlyConfigured(

View File

@ -103,8 +103,16 @@ what's passed by :class:`~django.template.backends.django.DjangoTemplates`.
* ``'django.template.loaders.app_directories.Loader'`` if and only if * ``'django.template.loaders.app_directories.Loader'`` if and only if
``app_dirs`` is ``True``. ``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. 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 * ``string_if_invalid`` is the output, as a string, that the template
system should use for invalid (e.g. misspelled) variables. system should use for invalid (e.g. misspelled) variables.
@ -899,18 +907,22 @@ loaders that come with Django:
.. class:: cached.Loader .. class:: cached.Loader
By default, the templating system will read and compile your templates every By default (when :setting:`DEBUG` is ``True``), the template system reads
time they need to be rendered. While the Django templating system is quite and compiles your templates every time they're rendered. While the Django
fast, the overhead from reading and compiling templates can add up. 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 You configure the cached template loader with a list of other loaders that
a list of other loaders that it should wrap. The wrapped loaders are used to it should wrap. The wrapped loaders are used to locate unknown templates
locate unknown templates when they are first encountered. The cached loader when they're first encountered. The cached loader then stores the compiled
then stores the compiled ``Template`` in memory. The cached ``Template`` ``Template`` in memory. The cached ``Template`` instance is returned for
instance is returned for subsequent requests to load the same template. subsequent requests to load the same template.
For example, to enable template caching with the ``filesystem`` and This loader is automatically enabled if :setting:`DEBUG` is ``False`` and
``app_directories`` template loaders you might use the following settings:: :setting:`OPTIONS['loaders'] <TEMPLATES-OPTIONS>` isn't specified.
You can also enable template caching with some custom template loaders
using settings like this::
TEMPLATES = [{ TEMPLATES = [{
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
@ -920,6 +932,7 @@ loaders that come with Django:
('django.template.loaders.cached.Loader', [ ('django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader', 'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.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 information, see :ref:`template tag thread safety considerations
<template_tag_thread_safety>`. <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`` ``django.template.loaders.locmem.Loader``

View File

@ -471,6 +471,12 @@ Miscellaneous
:class:`~django.core.serializers.json.DjangoJSONEncoder` (renamed in Django :class:`~django.core.serializers.json.DjangoJSONEncoder` (renamed in Django
1.0) is removed. 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: .. _deprecated-features-1.11:
Features deprecated in 1.11 Features deprecated in 1.11

View File

@ -130,3 +130,18 @@ class DjangoTemplatesTests(TemplateStringsTests):
engines['django'].from_string('Hello, {{ name }}').render({'name': 'Bob & Jim'}), engines['django'].from_string('Hello, {{ name }}').render({'name': 'Bob & Jim'}),
'Hello, Bob &amp; 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)

View File

@ -11,11 +11,14 @@ from django.test.client import RequestFactory
'APP_DIRS': True, 'APP_DIRS': True,
}, { }, {
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
'OPTIONS': { 'OPTIONS': {
'context_processors': [ 'context_processors': [
'django.template.context_processors.request', 'django.template.context_processors.request',
], ],
'loaders': [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
]
}, },
}]) }])
class TemplateLoaderTests(SimpleTestCase): class TemplateLoaderTests(SimpleTestCase):

View File

@ -279,7 +279,7 @@ class FileSystemLoaderTests(SimpleTestCase):
@classmethod @classmethod
def setUpClass(cls): 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() super(FileSystemLoaderTests, cls).setUpClass()
@contextmanager @contextmanager