Fixed 19949 -- Cached template loader now caches TemplateDoesNotExist
Thanks @timgraham and @jdunck for the code reviews and Kronuz for bug report and initial patch.
This commit is contained in:
parent
35230adf63
commit
f33db5a09a
|
@ -57,9 +57,11 @@ class Loader(BaseLoader):
|
||||||
|
|
||||||
def load_template(self, template_name, template_dirs=None):
|
def load_template(self, template_name, template_dirs=None):
|
||||||
key = self.cache_key(template_name, template_dirs)
|
key = self.cache_key(template_name, template_dirs)
|
||||||
try:
|
template_tuple = self.template_cache.get(key)
|
||||||
template = self.template_cache[key]
|
# cached a previous failure:
|
||||||
except KeyError:
|
if template_tuple is TemplateDoesNotExist:
|
||||||
|
raise TemplateDoesNotExist
|
||||||
|
elif template_tuple is None:
|
||||||
template, origin = self.find_template(template_name, template_dirs)
|
template, origin = self.find_template(template_name, template_dirs)
|
||||||
if not hasattr(template, 'render'):
|
if not hasattr(template, 'render'):
|
||||||
try:
|
try:
|
||||||
|
@ -69,9 +71,9 @@ class Loader(BaseLoader):
|
||||||
# back off to returning the source and display name for the template
|
# back off to returning the source and display name for the template
|
||||||
# we were asked to load. This allows for correct identification (later)
|
# we were asked to load. This allows for correct identification (later)
|
||||||
# of the actual template that does not exist.
|
# of the actual template that does not exist.
|
||||||
return template, origin
|
self.template_cache[key] = (template, origin)
|
||||||
self.template_cache[key] = template
|
self.template_cache[key] = (template, None)
|
||||||
return template, None
|
return self.template_cache[key]
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
"Empty the template cache."
|
"Empty the template cache."
|
||||||
|
|
|
@ -105,6 +105,7 @@ class EggLoaderTest(unittest.TestCase):
|
||||||
egg_loader = EggLoader()
|
egg_loader = EggLoader()
|
||||||
self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "y.html")
|
self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "y.html")
|
||||||
|
|
||||||
|
|
||||||
class CachedLoader(unittest.TestCase):
|
class CachedLoader(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.old_TEMPLATE_LOADERS = settings.TEMPLATE_LOADERS
|
self.old_TEMPLATE_LOADERS = settings.TEMPLATE_LOADERS
|
||||||
|
@ -127,6 +128,16 @@ class CachedLoader(unittest.TestCase):
|
||||||
# The two templates should not have the same content
|
# The two templates should not have the same content
|
||||||
self.assertNotEqual(t1.render(Context({})), t2.render(Context({})))
|
self.assertNotEqual(t1.render(Context({})), t2.render(Context({})))
|
||||||
|
|
||||||
|
def test_missing_template_is_cached(self):
|
||||||
|
"Check that the missing template is cached."
|
||||||
|
template_loader = loader.find_template_loader(settings.TEMPLATE_LOADERS[0])
|
||||||
|
# Empty cache, which may be filled from previous tests.
|
||||||
|
template_loader.reset()
|
||||||
|
# Check that 'missing.html' isn't already in cache before 'missing.html' is loaed
|
||||||
|
self.assertRaises(KeyError, lambda: template_loader.template_cache["missing.html"])
|
||||||
|
self.assertRaises(TemplateDoesNotExist, template_loader.load_template, "missing.html")
|
||||||
|
|
||||||
|
|
||||||
class RenderToStringTest(unittest.TestCase):
|
class RenderToStringTest(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
Loading…
Reference in New Issue