summaryrefslogtreecommitdiff
path: root/django/template
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2014-11-10 20:43:44 +0100
committerAymeric Augustin <aymeric.augustin@m4x.org>2014-12-28 15:57:11 +0100
commitb19693e6d8a509eaea282d250310b4ce3e94fe8d (patch)
tree327ee222918ea63ba4483d65cc5df71f4e8315e1 /django/template
parent7eefdbf7ab9f5bafe5baae2b877d93efc90e3044 (diff)
Imported BaseEngine from the DEP.
i18n is left aside for now.
Diffstat (limited to 'django/template')
-rw-r--r--django/template/backends/__init__.py0
-rw-r--r--django/template/backends/base.py80
2 files changed, 80 insertions, 0 deletions
diff --git a/django/template/backends/__init__.py b/django/template/backends/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/template/backends/__init__.py
diff --git a/django/template/backends/base.py b/django/template/backends/base.py
new file mode 100644
index 0000000000..f70114499f
--- /dev/null
+++ b/django/template/backends/base.py
@@ -0,0 +1,80 @@
+from django.core.exceptions import (
+ ImproperlyConfigured, SuspiciousFileOperation)
+from django.template.utils import get_app_template_dirs
+from django.utils._os import safe_join
+from django.utils.functional import cached_property
+
+
+class BaseEngine(object):
+
+ # Core methods: engines have to provide their own implementation
+ # (except for from_string which is optional).
+
+ def __init__(self, params):
+ """
+ Initializes the template engine.
+
+ Receives the configuration settings as a dict.
+ """
+ params = params.copy()
+ self.name = params.pop('NAME')
+ self.dirs = list(params.pop('DIRS'))
+ self.app_dirs = bool(params.pop('APP_DIRS'))
+ if params:
+ raise ImproperlyConfigured(
+ "Unknown parameters: {}".format(", ".join(params)))
+
+ @property
+ def app_dirname(self):
+ raise ImproperlyConfigured(
+ "{} doesn't support loading templates from installed "
+ "applications.".format(self.__class__.__name__))
+
+ def from_string(self, template_code):
+ """
+ Creates and returns a template for the given source code.
+
+ This method is optional.
+ """
+ raise NotImplementedError(
+ "subclasses of BaseEngine should provide "
+ "a from_string() method")
+
+ def get_template(self, template_name):
+ """
+ Loads and returns a template for the given name.
+
+ Raises TemplateDoesNotExist if no such template exists.
+ """
+ raise NotImplementedError(
+ "subclasses of BaseEngine must provide "
+ "a get_template() method")
+
+ # Utility methods: they are provided to minimize code duplication and
+ # security issues in third-party backends.
+
+ @cached_property
+ def template_dirs(self):
+ """
+ Returns a list of directories to search for templates.
+ """
+ # Immutable return value because it's cached and shared by callers.
+ template_dirs = tuple(self.dirs)
+ if self.app_dirs:
+ template_dirs += get_app_template_dirs(self.app_dirname)
+ return template_dirs
+
+ def iter_template_filenames(self, template_name):
+ """
+ Iterates over candidate files for template_name.
+
+ Ignores files that don't lie inside configured template dirs to avoid
+ directory traversal attacks.
+ """
+ for template_dir in self.template_dirs:
+ try:
+ yield safe_join(template_dir, template_name)
+ except SuspiciousFileOperation:
+ # The joined path was located outside of this template_dir
+ # (it might be inside another one, so this isn't fatal).
+ pass