From e8950668ca4c3160cef3e1191a02ba1388a98cac Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Sun, 15 Feb 2015 15:42:05 +0100 Subject: [PATCH] [1.8.x] Deprecated TEMPLATE_DEBUG setting. Backport of 15b711b from master. --- .../project_template/project_name/settings.py | 2 - django/template/backends/django.py | 2 +- django/template/defaulttags.py | 4 +- django/template/utils.py | 1 + django/test/signals.py | 1 + docs/howto/custom-template-tags.txt | 7 +-- docs/internals/deprecation.txt | 1 + docs/ref/settings.txt | 5 ++ docs/ref/templates/api.txt | 2 +- docs/ref/templates/upgrading.txt | 10 +++- docs/releases/1.4.txt | 4 +- docs/releases/1.7.txt | 2 +- docs/releases/1.8.txt | 1 + docs/topics/settings.txt | 2 +- docs/topics/templates.txt | 4 +- tests/generic_inline_admin/tests.py | 10 ++-- tests/template_tests/test_nodelist.py | 2 +- tests/template_tests/test_parser.py | 2 +- tests/template_tests/tests.py | 55 ++++++++++++------- tests/view_tests/tests/test_debug.py | 3 +- 20 files changed, 72 insertions(+), 48 deletions(-) diff --git a/django/conf/project_template/project_name/settings.py b/django/conf/project_template/project_name/settings.py index b3c629ec6e..87cc7136cd 100644 --- a/django/conf/project_template/project_name/settings.py +++ b/django/conf/project_template/project_name/settings.py @@ -25,8 +25,6 @@ SECRET_KEY = '{{ secret_key }}' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -TEMPLATE_DEBUG = True - ALLOWED_HOSTS = [] diff --git a/django/template/backends/django.py b/django/template/backends/django.py index 65c65bdeee..5940c0b457 100644 --- a/django/template/backends/django.py +++ b/django/template/backends/django.py @@ -18,7 +18,7 @@ class DjangoTemplates(BaseEngine): def __init__(self, params): params = params.copy() options = params.pop('OPTIONS').copy() - options.setdefault('debug', settings.TEMPLATE_DEBUG) + options.setdefault('debug', settings.DEBUG) options.setdefault('file_charset', settings.FILE_CHARSET) super(DjangoTemplates, self).__init__(params) self.engine = Engine(self.dirs, self.app_dirs, **options) diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py index a75248332c..da68ec6a66 100644 --- a/django/template/defaulttags.py +++ b/django/template/defaulttags.py @@ -209,8 +209,8 @@ class ForNode(Node): context.update(unpacked_vars) else: context[self.loopvars[0]] = item - # In TEMPLATE_DEBUG mode provide source of the node which - # actually raised the exception + # In debug mode provide the source of the node which raised + # the exception if context.engine.debug: for node in self.nodelist_loop: try: diff --git a/django/template/utils.py b/django/template/utils.py index f9b322fea9..8bfa9d4f0e 100644 --- a/django/template/utils.py +++ b/django/template/utils.py @@ -42,6 +42,7 @@ class EngineHandler(object): 'OPTIONS': { 'allowed_include_roots': settings.ALLOWED_INCLUDE_ROOTS, 'context_processors': settings.TEMPLATE_CONTEXT_PROCESSORS, + 'debug': settings.TEMPLATE_DEBUG, 'loaders': settings.TEMPLATE_LOADERS, 'string_if_invalid': settings.TEMPLATE_STRING_IF_INVALID, }, diff --git a/django/test/signals.py b/django/test/signals.py index d2bb209dbf..0c2bf5201c 100644 --- a/django/test/signals.py +++ b/django/test/signals.py @@ -93,6 +93,7 @@ def reset_template_engines(**kwargs): 'TEMPLATE_DEBUG', 'TEMPLATE_LOADERS', 'TEMPLATE_STRING_IF_INVALID', + 'DEBUG', 'FILE_CHARSET', 'INSTALLED_APPS', }: diff --git a/docs/howto/custom-template-tags.txt b/docs/howto/custom-template-tags.txt index b13c8cb81a..d8fde58ffd 100644 --- a/docs/howto/custom-template-tags.txt +++ b/docs/howto/custom-template-tags.txt @@ -772,10 +772,9 @@ Notes: * The ``render()`` method is where the work actually happens. * ``render()`` should generally fail silently, particularly in a production - environment where :setting:`DEBUG` and :setting:`TEMPLATE_DEBUG` are - ``False``. In some cases however, particularly if :setting:`TEMPLATE_DEBUG` is - ``True``, this method may raise an exception to make debugging easier. For - example, several core tags raise ``django.template.TemplateSyntaxError`` + environment. In some cases however, particularly if ``context.engine.debug`` + is ``True``, this method may raise an exception to make debugging easier. + For example, several core tags raise ``django.template.TemplateSyntaxError`` if they receive the wrong number or type of arguments. Ultimately, this decoupling of compilation and rendering results in an diff --git a/docs/internals/deprecation.txt b/docs/internals/deprecation.txt index 49a3982239..beec417f95 100644 --- a/docs/internals/deprecation.txt +++ b/docs/internals/deprecation.txt @@ -101,6 +101,7 @@ details on these changes. * ``ALLOWED_INCLUDE_ROOTS`` * ``TEMPLATE_CONTEXT_PROCESSORS`` + * ``TEMPLATE_DEBUG`` * ``TEMPLATE_DIRS`` * ``TEMPLATE_LOADERS`` * ``TEMPLATE_STRING_IF_INVALID`` diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index db2850da6d..4744098754 100644 --- a/docs/ref/settings.txt +++ b/docs/ref/settings.txt @@ -2421,6 +2421,11 @@ TEMPLATE_DEBUG Default: ``False`` +.. deprecated:: 1.8 + + Set the ``'debug'`` option in the :setting:`OPTIONS ` + of a ``DjangoTemplates`` backend instead. + 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 template rendering. This report contains the relevant snippet of the template, diff --git a/docs/ref/templates/api.txt b/docs/ref/templates/api.txt index 9faca5b9e1..b6d5c9e9c1 100644 --- a/docs/ref/templates/api.txt +++ b/docs/ref/templates/api.txt @@ -946,7 +946,7 @@ Template origin When an :class:`~django.template.Engine` is initialized with ``debug=True``, its templates have an ``origin`` attribute depending on the source they are loaded from. For engines initialized by Django, ``debug`` defaults to the -value of :setting:`TEMPLATE_DEBUG`. +value of :setting:`DEBUG`. .. class:: loader.LoaderOrigin diff --git a/docs/ref/templates/upgrading.txt b/docs/ref/templates/upgrading.txt index c7b07464b0..98778c36ba 100644 --- a/docs/ref/templates/upgrading.txt +++ b/docs/ref/templates/upgrading.txt @@ -10,7 +10,7 @@ The :setting:`TEMPLATES` settings ================================= 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 :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 ``'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 -``ALLOWED_INCLUDE_ROOTS``, ``TEMPLATE_CONTEXT_PROCESSORS``, ``TEMPLATE_DIRS``, -``TEMPLATE_LOADERS``, and ``TEMPLATE_STRING_IF_INVALID``. +``ALLOWED_INCLUDE_ROOTS``, ``TEMPLATE_CONTEXT_PROCESSORS``, +``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 entire :setting:`TEMPLATES` setting instead. diff --git a/docs/releases/1.4.txt b/docs/releases/1.4.txt index 811b800bb0..f4f85d0154 100644 --- a/docs/releases/1.4.txt +++ b/docs/releases/1.4.txt @@ -437,7 +437,7 @@ For example: 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 unrelated to template syntax) were wrapped in ``TemplateSyntaxError`` and 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 exception is annotated with the source information. This means that catching 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. ``truncatechars`` template filter diff --git a/docs/releases/1.7.txt b/docs/releases/1.7.txt index f4a2c5462b..052c073df9 100644 --- a/docs/releases/1.7.txt +++ b/docs/releases/1.7.txt @@ -846,7 +846,7 @@ Templates * It is now possible to :ttag:`include` templates recursively. * 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. * ``TypeError`` exceptions are no longer silenced when raised during the diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt index ff3683a4b0..331998c0f3 100644 --- a/docs/releases/1.8.txt +++ b/docs/releases/1.8.txt @@ -1262,6 +1262,7 @@ are deprecated in favor of :setting:`TEMPLATES`: * ``ALLOWED_INCLUDE_ROOTS`` * ``TEMPLATE_CONTEXT_PROCESSORS`` +* ``TEMPLATE_DEBUG`` * ``TEMPLATE_DIRS`` * ``TEMPLATE_LOADERS`` * ``TEMPLATE_STRING_IF_INVALID`` diff --git a/docs/topics/settings.txt b/docs/topics/settings.txt index e84b344e53..bf6a7a75d5 100644 --- a/docs/topics/settings.txt +++ b/docs/topics/settings.txt @@ -188,7 +188,7 @@ Example:: 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 argument representing a setting and its value. Each argument name should be all diff --git a/docs/topics/templates.txt b/docs/topics/templates.txt index 920637de44..b60a7813e0 100644 --- a/docs/topics/templates.txt +++ b/docs/topics/templates.txt @@ -364,9 +364,7 @@ applications. This generic name was kept for backwards-compatibility. exception raised during template rendering. This report contains the relevant snippet of the template with the appropriate line highlighted. - It defaults to the value of the :setting:`TEMPLATE_DEBUG` setting. The - setting is convenient for toggling template debug mode globally rather than - on a per-engine basis. + It defaults to the value of the :setting:`DEBUG` setting. * ``'loaders'``: a list of dotted Python paths to template loader classes. Each ``Loader`` class knows how to import templates from a particular diff --git a/tests/generic_inline_admin/tests.py b/tests/generic_inline_admin/tests.py index 58b1f930f1..4f94599f9d 100644 --- a/tests/generic_inline_admin/tests.py +++ b/tests/generic_inline_admin/tests.py @@ -19,11 +19,13 @@ from .admin import MediaInline, MediaPermanentInline, site as admin_site 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. -@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',), - TEMPLATE_DEBUG=True, - ROOT_URLCONF="generic_inline_admin.urls") +@override_settings( + DEBUG=True, + PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',), + ROOT_URLCONF="generic_inline_admin.urls", +) class GenericAdminViewTest(TestCase): fixtures = ['users.xml'] diff --git a/tests/template_tests/test_nodelist.py b/tests/template_tests/test_nodelist.py index 836d1b6db9..49e09833ed 100644 --- a/tests/template_tests/test_nodelist.py +++ b/tests/template_tests/test_nodelist.py @@ -33,7 +33,7 @@ class ErrorIndexTest(TestCase): Checks whether index of error is calculated correctly in 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): tests = [ ('{% load bad_tag %}{% for i in range %}{% badsimpletag %}{% endfor %}', (38, 56)), diff --git a/tests/template_tests/test_parser.py b/tests/template_tests/test_parser.py index 1e1d76b1bd..5d9a3a374e 100644 --- a/tests/template_tests/test_parser.py +++ b/tests/template_tests/test_parser.py @@ -89,7 +89,7 @@ class ParserTests(TestCase): with six.assertRaisesRegex(self, TypeError, "Variable must be a string or number, got <(class|type) 'dict'>"): Variable({}) - @override_settings(DEBUG=True, TEMPLATE_DEBUG=True) + @override_settings(DEBUG=True) def test_compile_filter_error(self): # regression test for #19819 msg = "Could not parse the remainder: '@bar' from 'foo@bar'" diff --git a/tests/template_tests/tests.py b/tests/template_tests/tests.py index ffc3064b41..cf37e1868b 100644 --- a/tests/template_tests/tests.py +++ b/tests/template_tests/tests.py @@ -85,10 +85,12 @@ class TemplateLoaderTests(SimpleTestCase): @override_settings(TEMPLATES=[{ 'BACKEND': 'django.template.backends.django.DjangoTemplates', '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): load_name = 'login.html' @@ -104,6 +106,7 @@ class TemplateLoaderTests(SimpleTestCase): 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [TEMPLATES_DIR], 'OPTIONS': { + 'debug': True, 'loaders': [ ('django.template.loaders.cached.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): load_name = 'login.html' @@ -126,12 +128,12 @@ class TemplateLoaderTests(SimpleTestCase): self.assertTrue(template_name.endswith(load_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): template = loader.get_template('login.html') self.assertEqual(template.origin.loadname, 'login.html') - @override_settings(TEMPLATE_DEBUG=True) + @override_settings(DEBUG=True) def test_string_origin(self): template = Template('string template') self.assertEqual(template.origin.source, 'string template') @@ -140,15 +142,17 @@ class TemplateLoaderTests(SimpleTestCase): template = loader.get_template('login.html') 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 # from base is used by all shipped loaders excepting cached, # which has its own test. @override_settings(TEMPLATES=[{ 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True, + 'OPTIONS': { + # Enable debug, otherwise the exception raised during + # {% include %} processing will be suppressed. + 'debug': True, + } }]) def test_include_missing_template(self): """ @@ -164,15 +168,17 @@ class TemplateLoaderTests(SimpleTestCase): self.assertEqual(e.args[0], 'missing.html') 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 # from base is used by all shipped loaders excepting cached, # which has its own test. @override_settings(TEMPLATES=[{ 'BACKEND': 'django.template.backends.django.DjangoTemplates', '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): """ @@ -193,6 +199,7 @@ class TemplateLoaderTests(SimpleTestCase): @override_settings(TEMPLATES=[{ 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'OPTIONS': { + 'debug': True, 'loaders': [ ('django.template.loaders.cached.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): """ Same as test_extends_include_missing_baseloader, only tests @@ -235,19 +241,28 @@ class TemplateLoaderTests(SimpleTestCase): output = outer_tmpl.render(ctx) 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): """ - 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 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" %}') 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): comments = [ { @@ -277,7 +292,7 @@ class TemplateRegressionTests(SimpleTestCase): split = token.split_contents() 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): # Regression test for #9005 t = Template('{% url will_not_match %}') @@ -307,7 +322,7 @@ class TemplateRegressionTests(SimpleTestCase): self.assertGreater(depth, 5, "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): """ The template system doesn't wrap exceptions, but annotates them. diff --git a/tests/view_tests/tests/test_debug.py b/tests/view_tests/tests/test_debug.py index 1db85b7c2b..6c04940cf5 100644 --- a/tests/view_tests/tests/test_debug.py +++ b/tests/view_tests/tests/test_debug.py @@ -44,8 +44,7 @@ class CallableSettingWrapperTests(TestCase): self.assertEqual(actual, "repr from the wrapped callable") -@override_settings(DEBUG=True, TEMPLATE_DEBUG=True, - ROOT_URLCONF="view_tests.urls") +@override_settings(DEBUG=True, ROOT_URLCONF="view_tests.urls") class DebugViewTests(TestCase): def test_files(self):