In one of my django projects, I use a lot of recursive template tags, which seem to cause quite a bit of slowdown while rendering them. I looked at the code in django.template.loaders.filesystem
def load_template_source(template_name, template_dirs=None):
tried = []
for filepath in get_template_sources(template_name, template_dirs):
try:
return (open(filepath).read().decode(settings.FILE_CHARSET), filepath)
except IOError:
tried.append(filepath)
if tried:
error_msg = "Tried %s" % tried
else:
error_msg = "Your TEMPLATE_DIRS setting is empty. Change it to point to at least one template directory."
raise TemplateDoesNotExist, error_msg
load_template_source.is_usable = True
Looks like the template is reloaded from the filesystem every time the a template is loaded. This gets really bad with custom templatetags and inclusion tags. Well, can’t we just load the file into memory, and the next time its needed, call os.stat() on the file and check if the file has been modified, if not don’t reload the file from disk. Finally, I settled on a compromise, don’t reload templates in production mode, and disable the template cache in debug mode.
Here’s template_cache.py
# -*- coding: utf-8 -*-
from django.template import loader, TemplateDoesNotExist
from django.conf import settings
template_cache = {}
def cached_loader( template_name, template_dirs=None ) :
global template_cache
t = template_cache.get(template_name)
if not t :
old_loaders = settings.TEMPLATE_LOADERS[:]
settings.TEMPLATE_LOADERS = old_loaders[1:]
loader.template_source_loaders = None
try :
template_cache[template_name] = t = loader.find_template_source( template_name, template_dirs )
finally :
settings.TEMPLATE_LOADERS = old_loaders # To avoid recursively calling cached_loader
loader.template_source_loaders = None
return t
cached_loader.is_usable = not settings.DEBUG # Avoid caching in debug mode
Leave a Reply