From 44ad691558c88ac54483030b2c8b749788c4600e Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Thu, 5 Feb 2015 11:53:04 +0100 Subject: [PATCH] Fixed #24265 -- Preserved template backend loading exceptions. If importing or initializing a template backend fails, attempting to access this template backend again must raise the same exception. --- django/template/utils.py | 4 +++ tests/template_backends/test_utils.py | 37 +++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 tests/template_backends/test_utils.py diff --git a/django/template/utils.py b/django/template/utils.py index 3303c1ccb7..be2166810c 100644 --- a/django/template/utils.py +++ b/django/template/utils.py @@ -90,6 +90,10 @@ class EngineHandler(object): "Could not find config for '{}' " "in settings.TEMPLATES".format(alias)) + # If importing or initializing the backend raises an exception, + # self._engines[alias] isn't set and this code may get executed + # again, so we must preserve the original params. See #24265. + params = params.copy() backend = params.pop('BACKEND') engine_cls = import_string(backend) engine = engine_cls(params) diff --git a/tests/template_backends/test_utils.py b/tests/template_backends/test_utils.py new file mode 100644 index 0000000000..3d2de99015 --- /dev/null +++ b/tests/template_backends/test_utils.py @@ -0,0 +1,37 @@ +from django.core.exceptions import ImproperlyConfigured +from django.template import engines +from django.test import SimpleTestCase, override_settings + + +class TemplateStringsTests(SimpleTestCase): + + @override_settings(TEMPLATES=[{ + 'BACKEND': 'raise.import.error', + }]) + def test_backend_import_error(self): + """ + Failing to import a backend keeps raising the original import error. + + Regression test for #24265. + """ + with self.assertRaises(ImportError): + engines.all() + with self.assertRaises(ImportError): + engines.all() + + @override_settings(TEMPLATES=[{ + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + # Incorrect: APP_DIRS and loaders are mutually incompatible. + 'APP_DIRS': True, + 'OPTIONS': {'loaders': []}, + }]) + def test_backend_improperly_configured(self): + """ + Failing to initialize a backend keeps raising the original exception. + + Regression test for #24265. + """ + with self.assertRaises(ImproperlyConfigured): + engines.all() + with self.assertRaises(ImproperlyConfigured): + engines.all()