Deprecated TEMPLATE_DEBUG setting.

This commit is contained in:
Aymeric Augustin 2015-02-15 15:42:05 +01:00
parent 9fbd302f91
commit 15b711b5ee
20 changed files with 72 additions and 48 deletions

View File

@ -25,8 +25,6 @@ SECRET_KEY = '{{ secret_key }}'
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True DEBUG = True
TEMPLATE_DEBUG = True
ALLOWED_HOSTS = [] ALLOWED_HOSTS = []

View File

@ -18,7 +18,7 @@ class DjangoTemplates(BaseEngine):
def __init__(self, params): def __init__(self, params):
params = params.copy() params = params.copy()
options = params.pop('OPTIONS').copy() options = params.pop('OPTIONS').copy()
options.setdefault('debug', settings.TEMPLATE_DEBUG) options.setdefault('debug', settings.DEBUG)
options.setdefault('file_charset', settings.FILE_CHARSET) options.setdefault('file_charset', settings.FILE_CHARSET)
super(DjangoTemplates, self).__init__(params) super(DjangoTemplates, self).__init__(params)
self.engine = Engine(self.dirs, self.app_dirs, **options) self.engine = Engine(self.dirs, self.app_dirs, **options)

View File

@ -209,8 +209,8 @@ class ForNode(Node):
context.update(unpacked_vars) context.update(unpacked_vars)
else: else:
context[self.loopvars[0]] = item context[self.loopvars[0]] = item
# In TEMPLATE_DEBUG mode provide source of the node which # In debug mode provide the source of the node which raised
# actually raised the exception # the exception
if context.engine.debug: if context.engine.debug:
for node in self.nodelist_loop: for node in self.nodelist_loop:
try: try:

View File

@ -42,6 +42,7 @@ class EngineHandler(object):
'OPTIONS': { 'OPTIONS': {
'allowed_include_roots': settings.ALLOWED_INCLUDE_ROOTS, 'allowed_include_roots': settings.ALLOWED_INCLUDE_ROOTS,
'context_processors': settings.TEMPLATE_CONTEXT_PROCESSORS, 'context_processors': settings.TEMPLATE_CONTEXT_PROCESSORS,
'debug': settings.TEMPLATE_DEBUG,
'loaders': settings.TEMPLATE_LOADERS, 'loaders': settings.TEMPLATE_LOADERS,
'string_if_invalid': settings.TEMPLATE_STRING_IF_INVALID, 'string_if_invalid': settings.TEMPLATE_STRING_IF_INVALID,
}, },

View File

@ -93,6 +93,7 @@ def reset_template_engines(**kwargs):
'TEMPLATE_DEBUG', 'TEMPLATE_DEBUG',
'TEMPLATE_LOADERS', 'TEMPLATE_LOADERS',
'TEMPLATE_STRING_IF_INVALID', 'TEMPLATE_STRING_IF_INVALID',
'DEBUG',
'FILE_CHARSET', 'FILE_CHARSET',
'INSTALLED_APPS', 'INSTALLED_APPS',
}: }:

View File

@ -756,10 +756,9 @@ Notes:
* The ``render()`` method is where the work actually happens. * The ``render()`` method is where the work actually happens.
* ``render()`` should generally fail silently, particularly in a production * ``render()`` should generally fail silently, particularly in a production
environment where :setting:`DEBUG` and :setting:`TEMPLATE_DEBUG` are environment. In some cases however, particularly if ``context.engine.debug``
``False``. In some cases however, particularly if :setting:`TEMPLATE_DEBUG` is is ``True``, this method may raise an exception to make debugging easier.
``True``, this method may raise an exception to make debugging easier. For For example, several core tags raise ``django.template.TemplateSyntaxError``
example, several core tags raise ``django.template.TemplateSyntaxError``
if they receive the wrong number or type of arguments. if they receive the wrong number or type of arguments.
Ultimately, this decoupling of compilation and rendering results in an Ultimately, this decoupling of compilation and rendering results in an

View File

@ -116,6 +116,7 @@ details on these changes.
* ``ALLOWED_INCLUDE_ROOTS`` * ``ALLOWED_INCLUDE_ROOTS``
* ``TEMPLATE_CONTEXT_PROCESSORS`` * ``TEMPLATE_CONTEXT_PROCESSORS``
* ``TEMPLATE_DEBUG``
* ``TEMPLATE_DIRS`` * ``TEMPLATE_DIRS``
* ``TEMPLATE_LOADERS`` * ``TEMPLATE_LOADERS``
* ``TEMPLATE_STRING_IF_INVALID`` * ``TEMPLATE_STRING_IF_INVALID``

View File

@ -2250,6 +2250,11 @@ TEMPLATE_DEBUG
Default: ``False`` Default: ``False``
.. deprecated:: 1.8
Set the ``'debug'`` option in the :setting:`OPTIONS <TEMPLATES-OPTIONS>`
of a ``DjangoTemplates`` backend instead.
A boolean that turns on/off template debug mode. If this is ``True``, the fancy A boolean that turns on/off template debug mode. If this is ``True``, the fancy
error page will display a detailed report for any exception raised during error page will display a detailed report for any exception raised during
template rendering. This report contains the relevant snippet of the template, template rendering. This report contains the relevant snippet of the template,

View File

@ -936,7 +936,7 @@ Template origin
When an :class:`~django.template.Engine` is initialized with ``debug=True``, When an :class:`~django.template.Engine` is initialized with ``debug=True``,
its templates have an ``origin`` attribute depending on the source they are its templates have an ``origin`` attribute depending on the source they are
loaded from. For engines initialized by Django, ``debug`` defaults to the loaded from. For engines initialized by Django, ``debug`` defaults to the
value of :setting:`TEMPLATE_DEBUG`. value of :setting:`DEBUG`.
.. class:: loader.LoaderOrigin .. class:: loader.LoaderOrigin

View File

@ -10,7 +10,7 @@ The :setting:`TEMPLATES` settings
================================= =================================
A new setting was introduced in Django 1.8: :setting:`TEMPLATES`. All existing A new setting was introduced in Django 1.8: :setting:`TEMPLATES`. All existing
template-related settings except :setting:`TEMPLATE_DEBUG` were deprecated. template-related settings were deprecated.
During the deprecation period, Django will create a backwards-compatible During the deprecation period, Django will create a backwards-compatible
:setting:`TEMPLATES` based on the ``TEMPLATE_*`` settings if you don't define :setting:`TEMPLATES` based on the ``TEMPLATE_*`` settings if you don't define
@ -85,9 +85,13 @@ If your settings module defines ``ALLOWED_INCLUDE_ROOTS`` or
``'allowed_include_roots'`` and ``'string_if_invalid'`` keys in the ``'allowed_include_roots'`` and ``'string_if_invalid'`` keys in the
``'OPTIONS'`` dictionary. ``'OPTIONS'`` dictionary.
If it sets ``TEMPLATE_DEBUG`` to a value that differs from :setting:`DEBUG`,
include that value under the ``'debug'`` key in ``'OPTIONS'``.
Once you have defined :setting:`TEMPLATES`, you can safely remove Once you have defined :setting:`TEMPLATES`, you can safely remove
``ALLOWED_INCLUDE_ROOTS``, ``TEMPLATE_CONTEXT_PROCESSORS``, ``TEMPLATE_DIRS``, ``ALLOWED_INCLUDE_ROOTS``, ``TEMPLATE_CONTEXT_PROCESSORS``,
``TEMPLATE_LOADERS``, and ``TEMPLATE_STRING_IF_INVALID``. ``TEMPLATE_DEBUG``, ``TEMPLATE_DIRS``, ``TEMPLATE_LOADERS``, and
``TEMPLATE_STRING_IF_INVALID``.
If you are overriding some of these settings in tests, you should override the If you are overriding some of these settings in tests, you should override the
entire :setting:`TEMPLATES` setting instead. entire :setting:`TEMPLATES` setting instead.

View File

@ -437,7 +437,7 @@ For example:
No wrapping of exceptions in ``TEMPLATE_DEBUG`` mode No wrapping of exceptions in ``TEMPLATE_DEBUG`` mode
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In previous versions of Django, whenever the :setting:`TEMPLATE_DEBUG` setting In previous versions of Django, whenever the ``TEMPLATE_DEBUG`` setting
was ``True``, any exception raised during template rendering (even exceptions was ``True``, any exception raised during template rendering (even exceptions
unrelated to template syntax) were wrapped in ``TemplateSyntaxError`` and unrelated to template syntax) were wrapped in ``TemplateSyntaxError`` and
re-raised. This was done in order to provide detailed template source location re-raised. This was done in order to provide detailed template source location
@ -446,7 +446,7 @@ information in the debug 500 page.
In Django 1.4, exceptions are no longer wrapped. Instead, the original In Django 1.4, exceptions are no longer wrapped. Instead, the original
exception is annotated with the source information. This means that catching exception is annotated with the source information. This means that catching
exceptions from template rendering is now consistent regardless of the value of exceptions from template rendering is now consistent regardless of the value of
:setting:`TEMPLATE_DEBUG`, and there's no need to catch and unwrap ``TEMPLATE_DEBUG``, and there's no need to catch and unwrap
``TemplateSyntaxError`` in order to catch other errors. ``TemplateSyntaxError`` in order to catch other errors.
``truncatechars`` template filter ``truncatechars`` template filter

View File

@ -845,7 +845,7 @@ Templates
* It is now possible to :ttag:`include` templates recursively. * It is now possible to :ttag:`include` templates recursively.
* Template objects now have an origin attribute set when * Template objects now have an origin attribute set when
:setting:`TEMPLATE_DEBUG` is ``True``. This allows template origins to be ``TEMPLATE_DEBUG`` is ``True``. This allows template origins to be
inspected and logged outside of the ``django.template`` infrastructure. inspected and logged outside of the ``django.template`` infrastructure.
* ``TypeError`` exceptions are no longer silenced when raised during the * ``TypeError`` exceptions are no longer silenced when raised during the

View File

@ -1263,6 +1263,7 @@ are deprecated in favor of :setting:`TEMPLATES`:
* ``ALLOWED_INCLUDE_ROOTS`` * ``ALLOWED_INCLUDE_ROOTS``
* ``TEMPLATE_CONTEXT_PROCESSORS`` * ``TEMPLATE_CONTEXT_PROCESSORS``
* ``TEMPLATE_DEBUG``
* ``TEMPLATE_DIRS`` * ``TEMPLATE_DIRS``
* ``TEMPLATE_LOADERS`` * ``TEMPLATE_LOADERS``
* ``TEMPLATE_STRING_IF_INVALID`` * ``TEMPLATE_STRING_IF_INVALID``

View File

@ -188,7 +188,7 @@ Example::
from django.conf import settings from django.conf import settings
settings.configure(DEBUG=True, TEMPLATE_DEBUG=True) settings.configure(DEBUG=True)
Pass ``configure()`` as many keyword arguments as you'd like, with each keyword Pass ``configure()`` as many keyword arguments as you'd like, with each keyword
argument representing a setting and its value. Each argument name should be all argument representing a setting and its value. Each argument name should be all

View File

@ -356,9 +356,7 @@ applications. This generic name was kept for backwards-compatibility.
exception raised during template rendering. This report contains the exception raised during template rendering. This report contains the
relevant snippet of the template with the appropriate line highlighted. relevant snippet of the template with the appropriate line highlighted.
It defaults to the value of the :setting:`TEMPLATE_DEBUG` setting. The It defaults to the value of the :setting:`DEBUG` setting.
setting is convenient for toggling template debug mode globally rather than
on a per-engine basis.
* ``'loaders'``: a list of dotted Python paths to template loader classes. * ``'loaders'``: a list of dotted Python paths to template loader classes.
Each ``Loader`` class knows how to import templates from a particular Each ``Loader`` class knows how to import templates from a particular

View File

@ -15,11 +15,13 @@ from .admin import MediaInline, MediaPermanentInline, site as admin_site
from .models import Category, Episode, EpisodePermanent, Media from .models import Category, Episode, EpisodePermanent, Media
# Set TEMPLATE_DEBUG to True to ensure {% include %} will raise exceptions. # Set DEBUG to True to ensure {% include %} will raise exceptions.
# That is how inlines are rendered and #9498 will bubble up if it is an issue. # That is how inlines are rendered and #9498 will bubble up if it is an issue.
@override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'], @override_settings(
TEMPLATE_DEBUG=True, DEBUG=True,
ROOT_URLCONF="generic_inline_admin.urls") PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
ROOT_URLCONF="generic_inline_admin.urls",
)
class GenericAdminViewTest(TestCase): class GenericAdminViewTest(TestCase):
fixtures = ['users.xml'] fixtures = ['users.xml']

View File

@ -33,7 +33,7 @@ class ErrorIndexTest(TestCase):
Checks whether index of error is calculated correctly in Checks whether index of error is calculated correctly in
template debugger in for loops. Refs ticket #5831 template debugger in for loops. Refs ticket #5831
""" """
@override_settings(DEBUG=True, TEMPLATE_DEBUG=True) @override_settings(DEBUG=True)
def test_correct_exception_index(self): def test_correct_exception_index(self):
tests = [ tests = [
('{% load bad_tag %}{% for i in range %}{% badsimpletag %}{% endfor %}', (38, 56)), ('{% load bad_tag %}{% for i in range %}{% badsimpletag %}{% endfor %}', (38, 56)),

View File

@ -89,7 +89,7 @@ class ParserTests(TestCase):
with six.assertRaisesRegex(self, TypeError, "Variable must be a string or number, got <(class|type) 'dict'>"): with six.assertRaisesRegex(self, TypeError, "Variable must be a string or number, got <(class|type) 'dict'>"):
Variable({}) Variable({})
@override_settings(DEBUG=True, TEMPLATE_DEBUG=True) @override_settings(DEBUG=True)
def test_compile_filter_error(self): def test_compile_filter_error(self):
# regression test for #19819 # regression test for #19819
msg = "Could not parse the remainder: '@bar' from 'foo@bar'" msg = "Could not parse the remainder: '@bar' from 'foo@bar'"

View File

@ -85,10 +85,12 @@ class TemplateLoaderTests(SimpleTestCase):
@override_settings(TEMPLATES=[{ @override_settings(TEMPLATES=[{
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [TEMPLATES_DIR], 'DIRS': [TEMPLATES_DIR],
'OPTIONS': {
# Turn DEBUG on, so that the origin file name will be kept with
# the compiled templates.
'debug': True,
}
}]) }])
# Turn TEMPLATE_DEBUG on, so that the origin file name will be kept with
# the compiled templates.
@override_settings(TEMPLATE_DEBUG=True)
def test_loader_debug_origin(self): def test_loader_debug_origin(self):
load_name = 'login.html' load_name = 'login.html'
@ -104,6 +106,7 @@ class TemplateLoaderTests(SimpleTestCase):
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [TEMPLATES_DIR], 'DIRS': [TEMPLATES_DIR],
'OPTIONS': { 'OPTIONS': {
'debug': True,
'loaders': [ 'loaders': [
('django.template.loaders.cached.Loader', [ ('django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader', 'django.template.loaders.filesystem.Loader',
@ -111,7 +114,6 @@ class TemplateLoaderTests(SimpleTestCase):
], ],
}, },
}]) }])
@override_settings(TEMPLATE_DEBUG=True)
def test_cached_loader_debug_origin(self): def test_cached_loader_debug_origin(self):
load_name = 'login.html' load_name = 'login.html'
@ -126,12 +128,12 @@ class TemplateLoaderTests(SimpleTestCase):
self.assertTrue(template_name.endswith(load_name), self.assertTrue(template_name.endswith(load_name),
'Cached template loaded through cached loader has incorrect name for debug page: %s' % template_name) 'Cached template loaded through cached loader has incorrect name for debug page: %s' % template_name)
@override_settings(TEMPLATE_DEBUG=True) @override_settings(DEBUG=True)
def test_loader_origin(self): def test_loader_origin(self):
template = loader.get_template('login.html') template = loader.get_template('login.html')
self.assertEqual(template.origin.loadname, 'login.html') self.assertEqual(template.origin.loadname, 'login.html')
@override_settings(TEMPLATE_DEBUG=True) @override_settings(DEBUG=True)
def test_string_origin(self): def test_string_origin(self):
template = Template('string template') template = Template('string template')
self.assertEqual(template.origin.source, 'string template') self.assertEqual(template.origin.source, 'string template')
@ -140,15 +142,17 @@ class TemplateLoaderTests(SimpleTestCase):
template = loader.get_template('login.html') template = loader.get_template('login.html')
self.assertEqual(template.origin, None) self.assertEqual(template.origin, None)
# TEMPLATE_DEBUG must be true, otherwise the exception raised
# during {% include %} processing will be suppressed.
@override_settings(TEMPLATE_DEBUG=True)
# Test the base loader class via the app loader. load_template # Test the base loader class via the app loader. load_template
# from base is used by all shipped loaders excepting cached, # from base is used by all shipped loaders excepting cached,
# which has its own test. # which has its own test.
@override_settings(TEMPLATES=[{ @override_settings(TEMPLATES=[{
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True, 'APP_DIRS': True,
'OPTIONS': {
# Enable debug, otherwise the exception raised during
# {% include %} processing will be suppressed.
'debug': True,
}
}]) }])
def test_include_missing_template(self): def test_include_missing_template(self):
""" """
@ -164,15 +168,17 @@ class TemplateLoaderTests(SimpleTestCase):
self.assertEqual(e.args[0], 'missing.html') self.assertEqual(e.args[0], 'missing.html')
self.assertEqual(r, None, 'Template rendering unexpectedly succeeded, produced: ->%r<-' % r) self.assertEqual(r, None, 'Template rendering unexpectedly succeeded, produced: ->%r<-' % r)
# TEMPLATE_DEBUG must be true, otherwise the exception raised
# during {% include %} processing will be suppressed.
@override_settings(TEMPLATE_DEBUG=True)
# Test the base loader class via the app loader. load_template # Test the base loader class via the app loader. load_template
# from base is used by all shipped loaders excepting cached, # from base is used by all shipped loaders excepting cached,
# which has its own test. # which has its own test.
@override_settings(TEMPLATES=[{ @override_settings(TEMPLATES=[{
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True, 'APP_DIRS': True,
'OPTIONS': {
# Enable debug, otherwise the exception raised during
# {% include %} processing will be suppressed.
'debug': True,
}
}]) }])
def test_extends_include_missing_baseloader(self): def test_extends_include_missing_baseloader(self):
""" """
@ -193,6 +199,7 @@ class TemplateLoaderTests(SimpleTestCase):
@override_settings(TEMPLATES=[{ @override_settings(TEMPLATES=[{
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'OPTIONS': { 'OPTIONS': {
'debug': True,
'loaders': [ 'loaders': [
('django.template.loaders.cached.Loader', [ ('django.template.loaders.cached.Loader', [
'django.template.loaders.app_directories.Loader', 'django.template.loaders.app_directories.Loader',
@ -200,7 +207,6 @@ class TemplateLoaderTests(SimpleTestCase):
], ],
}, },
}]) }])
@override_settings(TEMPLATE_DEBUG=True)
def test_extends_include_missing_cachedloader(self): def test_extends_include_missing_cachedloader(self):
""" """
Same as test_extends_include_missing_baseloader, only tests Same as test_extends_include_missing_baseloader, only tests
@ -235,19 +241,28 @@ class TemplateLoaderTests(SimpleTestCase):
output = outer_tmpl.render(ctx) output = outer_tmpl.render(ctx)
self.assertEqual(output, 'This worked!') self.assertEqual(output, 'This worked!')
@override_settings(TEMPLATE_DEBUG=True) @override_settings(TEMPLATES=[{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'OPTIONS': {
'debug': True,
},
}])
def test_include_immediate_missing(self): def test_include_immediate_missing(self):
""" """
Regression test for #16417 -- {% include %} tag raises TemplateDoesNotExist at compile time if TEMPLATE_DEBUG is True
Test that an {% include %} tag with a literal string referencing a Test that an {% include %} tag with a literal string referencing a
template that does not exist does not raise an exception at parse template that does not exist does not raise an exception at parse
time. time. Regression test for #16417.
""" """
tmpl = Template('{% include "this_does_not_exist.html" %}') tmpl = Template('{% include "this_does_not_exist.html" %}')
self.assertIsInstance(tmpl, Template) self.assertIsInstance(tmpl, Template)
@override_settings(TEMPLATE_DEBUG=True) @override_settings(TEMPLATES=[{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
'OPTIONS': {
'debug': True,
},
}])
def test_include_recursive(self): def test_include_recursive(self):
comments = [ comments = [
{ {
@ -277,7 +292,7 @@ class TemplateRegressionTests(SimpleTestCase):
split = token.split_contents() split = token.split_contents()
self.assertEqual(split, ["sometag", '_("Page not found")', 'value|yesno:_("yes,no")']) self.assertEqual(split, ["sometag", '_("Page not found")', 'value|yesno:_("yes,no")'])
@override_settings(SETTINGS_MODULE=None, TEMPLATE_DEBUG=True) @override_settings(SETTINGS_MODULE=None, DEBUG=True)
def test_url_reverse_no_settings_module(self): def test_url_reverse_no_settings_module(self):
# Regression test for #9005 # Regression test for #9005
t = Template('{% url will_not_match %}') t = Template('{% url will_not_match %}')
@ -307,7 +322,7 @@ class TemplateRegressionTests(SimpleTestCase):
self.assertGreater(depth, 5, self.assertGreater(depth, 5,
"The traceback context was lost when reraising the traceback. See #19827") "The traceback context was lost when reraising the traceback. See #19827")
@override_settings(DEBUG=True, TEMPLATE_DEBUG=True) @override_settings(DEBUG=True)
def test_no_wrapped_exception(self): def test_no_wrapped_exception(self):
""" """
The template system doesn't wrap exceptions, but annotates them. The template system doesn't wrap exceptions, but annotates them.

View File

@ -44,8 +44,7 @@ class CallableSettingWrapperTests(TestCase):
self.assertEqual(actual, "repr from the wrapped callable") self.assertEqual(actual, "repr from the wrapped callable")
@override_settings(DEBUG=True, TEMPLATE_DEBUG=True, @override_settings(DEBUG=True, ROOT_URLCONF="view_tests.urls")
ROOT_URLCONF="view_tests.urls")
class DebugViewTests(TestCase): class DebugViewTests(TestCase):
def test_files(self): def test_files(self):