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.
This commit is contained in:
Aymeric Augustin 2015-02-05 11:53:04 +01:00
parent 27f9ff459b
commit 44ad691558
2 changed files with 41 additions and 0 deletions

View File

@ -90,6 +90,10 @@ class EngineHandler(object):
"Could not find config for '{}' " "Could not find config for '{}' "
"in settings.TEMPLATES".format(alias)) "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') backend = params.pop('BACKEND')
engine_cls = import_string(backend) engine_cls = import_string(backend)
engine = engine_cls(params) engine = engine_cls(params)

View File

@ -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()