12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- """
- Wrapper for loading templates from "templates" directories in INSTALLED_APPS
- packages.
- """
- import os
- import sys
- from django.apps import apps
- from django.conf import settings
- from django.template.base import TemplateDoesNotExist
- from django.template.loader import BaseLoader
- from django.utils._os import safe_join
- from django.utils import six
- def calculate_app_template_dirs():
- if six.PY2:
- fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding()
- app_template_dirs = []
- for app_config in apps.get_app_configs():
- if not app_config.path:
- continue
- template_dir = os.path.join(app_config.path, 'templates')
- if os.path.isdir(template_dir):
- if six.PY2:
- template_dir = template_dir.decode(fs_encoding)
- app_template_dirs.append(template_dir)
- return tuple(app_template_dirs)
- # At compile time, cache the directories to search.
- app_template_dirs = calculate_app_template_dirs()
- class Loader(BaseLoader):
- is_usable = True
- def get_template_sources(self, template_name, template_dirs=None):
- """
- Returns the absolute paths to "template_name", when appended to each
- directory in "template_dirs". Any paths that don't lie inside one of the
- template dirs are excluded from the result set, for security reasons.
- """
- if not template_dirs:
- template_dirs = app_template_dirs
- for template_dir in template_dirs:
- try:
- yield safe_join(template_dir, template_name)
- except UnicodeDecodeError:
- # The template dir name was a bytestring that wasn't valid UTF-8.
- raise
- except ValueError:
- # The joined path was located outside of template_dir.
- pass
- def load_template_source(self, template_name, template_dirs=None):
- for filepath in self.get_template_sources(template_name, template_dirs):
- try:
- with open(filepath, 'rb') as fp:
- return (fp.read().decode(settings.FILE_CHARSET), filepath)
- except IOError:
- pass
- raise TemplateDoesNotExist(template_name)
|