From 44ad691558c88ac54483030b2c8b749788c4600e Mon Sep 17 00:00:00 2001
From: Aymeric Augustin <aymeric.augustin@m4x.org>
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()