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:
SusanTan 2013-08-21 11:23:53 -07:00 committed by Tim Graham
parent 35230adf63
commit f33db5a09a
2 changed files with 19 additions and 6 deletions

View File

@ -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."

View File

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