web/lib/django/template/loaders/filesystem.py
changeset 29 cc9b7e14412b
parent 0 0d40e90630ef
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
     2 Wrapper for loading templates from the filesystem.
     2 Wrapper for loading templates from the filesystem.
     3 """
     3 """
     4 
     4 
     5 from django.conf import settings
     5 from django.conf import settings
     6 from django.template import TemplateDoesNotExist
     6 from django.template import TemplateDoesNotExist
       
     7 from django.template.loader import BaseLoader
     7 from django.utils._os import safe_join
     8 from django.utils._os import safe_join
     8 
     9 
     9 def get_template_sources(template_name, template_dirs=None):
    10 class Loader(BaseLoader):
    10     """
    11     is_usable = True
    11     Returns the absolute paths to "template_name", when appended to each
    12 
    12     directory in "template_dirs". Any paths that don't lie inside one of the
    13     def get_template_sources(self, template_name, template_dirs=None):
    13     template dirs are excluded from the result set, for security reasons.
    14         """
    14     """
    15         Returns the absolute paths to "template_name", when appended to each
    15     if not template_dirs:
    16         directory in "template_dirs". Any paths that don't lie inside one of the
    16         template_dirs = settings.TEMPLATE_DIRS
    17         template dirs are excluded from the result set, for security reasons.
    17     for template_dir in template_dirs:
    18         """
    18         try:
    19         if not template_dirs:
    19             yield safe_join(template_dir, template_name)
    20             template_dirs = settings.TEMPLATE_DIRS
    20         except UnicodeDecodeError:
    21         for template_dir in template_dirs:
    21             # The template dir name was a bytestring that wasn't valid UTF-8.
    22             try:
    22             raise
    23                 yield safe_join(template_dir, template_name)
    23         except ValueError:
    24             except UnicodeDecodeError:
    24             # The joined path was located outside of this particular
    25                 # The template dir name was a bytestring that wasn't valid UTF-8.
    25             # template_dir (it might be inside another one, so this isn't
    26                 raise
    26             # fatal).
    27             except ValueError:
    27             pass
    28                 # The joined path was located outside of this particular
       
    29                 # template_dir (it might be inside another one, so this isn't
       
    30                 # fatal).
       
    31                 pass
       
    32 
       
    33     def load_template_source(self, template_name, template_dirs=None):
       
    34         tried = []
       
    35         for filepath in self.get_template_sources(template_name, template_dirs):
       
    36             try:
       
    37                 file = open(filepath)
       
    38                 try:
       
    39                     return (file.read().decode(settings.FILE_CHARSET), filepath)
       
    40                 finally:
       
    41                     file.close()
       
    42             except IOError:
       
    43                 tried.append(filepath)
       
    44         if tried:
       
    45             error_msg = "Tried %s" % tried
       
    46         else:
       
    47             error_msg = "Your TEMPLATE_DIRS setting is empty. Change it to point to at least one template directory."
       
    48         raise TemplateDoesNotExist(error_msg)
       
    49     load_template_source.is_usable = True
       
    50 
       
    51 _loader = Loader()
    28 
    52 
    29 def load_template_source(template_name, template_dirs=None):
    53 def load_template_source(template_name, template_dirs=None):
    30     tried = []
    54     # For backwards compatibility
    31     for filepath in get_template_sources(template_name, template_dirs):
    55     import warnings
    32         try:
    56     warnings.warn(
    33             return (open(filepath).read().decode(settings.FILE_CHARSET), filepath)
    57         "'django.template.loaders.filesystem.load_template_source' is deprecated; use 'django.template.loaders.filesystem.Loader' instead.",
    34         except IOError:
    58         PendingDeprecationWarning
    35             tried.append(filepath)
    59     )
    36     if tried:
    60     return _loader.load_template_source(template_name, template_dirs)
    37         error_msg = "Tried %s" % tried
       
    38     else:
       
    39         error_msg = "Your TEMPLATE_DIRS setting is empty. Change it to point to at least one template directory."
       
    40     raise TemplateDoesNotExist, error_msg
       
    41 load_template_source.is_usable = True
    61 load_template_source.is_usable = True