class_docstr: Baseclass for all loaders.  Subclass this and override `get_source` to
  implement a custom loading mechanism.  The environment provides a
  `get_template` method that calls the loader's `load` method to get the
  :class:`Template` object.
  
  A very basic example for a loader that looks up templates on the file
  system could look like this::
  
      from jinja2 import BaseLoader, TemplateNotFound
      from os.path import join, exists, getmtime
  
      class MyLoader(BaseLoader):
  
          def __init__(self, path):
              self.path = path
  
          def get_source(self, environment, template):
              path = join(self.path, template)
              if not exists(path):
                  raise TemplateNotFound(template)
              mtime = getmtime(path)
              with open(path) as f:
                  source = f.read()
              return source, path, lambda: mtime == getmtime(path)
class_docstr_tok: ["Baseclass","for","all","loaders",".","Subclass","this","and","override","`","get_source","`","to","implement","a","custom","loading","mechanism",".","The","environment","provides","a","`","get_template","`","method","that","calls","the","loader","'s","`","load","`","method","to","get","the",":","class",":","`","Template","`","object",".","A","very","basic","example","for","a","loader","that","looks","up","templates","on","the","file","system","could","look","like","this",":",":","from","jinja2","import","BaseLoader",",","TemplateNotFound","from","os.path","import","join",",","exists",",","getmtime","class","MyLoader","(","BaseLoader",")",":","def","__init__","(","self",",","path",")",":","self.path","=","path","def","get_source","(","self",",","environment",",","template",")",":","path","=","join","(","self.path",",","template",")","if","not","exists","(","path",")",":","raise","TemplateNotFound","(","template",")","mtime","=","getmtime","(","path",")","with","open","(","path",")","as","f",":","source","=","f.read","(",")","return","source",",","path",",","lambda",":","mtime","==","getmtime","(","path",")"]
docstr: Get the template source, filename and reload helper for a template.
  It's passed the environment and template name and has to return a
  tuple in the form ``(source, filename, uptodate)`` or raise a
  `TemplateNotFound` error if it can't locate the template.
  
  The source part of the returned tuple must be the source of the
  template as a string. The filename should be the name of the
  file on the filesystem if it was loaded from there, otherwise
  ``None``. The filename is used by Python for the tracebacks
  if no loader extension is used.
  
  The last item in the tuple is the `uptodate` function.  If auto
  reloading is enabled it's always called to check if the template
  changed.  No arguments are passed so the function must store the
  old state somewhere (for example in a closure).  If it returns `False`
  the template will be reloaded.
docstr_tok: ["Get","the","template","source",",","filename","and","reload","helper","for","a","template",".","It","'s","passed","the","environment","and","template","name","and","has","to","return","a","tuple","in","the","form","``","(","source",",","filename",",","uptodate",")","``","or","raise","a","`","TemplateNotFound","`","error","if","it","ca","n't","locate","the","template",".","The","source","part","of","the","returned","tuple","must","be","the","source","of","the","template","as","a","string",".","The","filename","should","be","the","name","of","the","file","on","the","filesystem","if","it","was","loaded","from","there",",","otherwise","``","None","``",".","The","filename","is","used","by","Python","for","the","tracebacks","if","no","loader","extension","is","used",".","The","last","item","in","the","tuple","is","the","`","uptodate","`","function",".","If","auto","reloading","is","enabled","it","'s","always","called","to","check","if","the","template","changed",".","No","arguments","are","passed","so","the","function","must","store","the","old","state","somewhere","(","for","example","in","a","closure",")",".","If","it","returns","`","False","`","the","template","will","be","reloaded","."]
code: def get_source(
      self, environment: "Environment", template: str
  ) -> t.Tuple[str, t.Optional[str], t.Optional[t.Callable[[], bool]]]:
      """Get the template source, filename and reload helper for a template.
      It's passed the environment and template name and has to return a
      tuple in the form ``(source, filename, uptodate)`` or raise a
      `TemplateNotFound` error if it can't locate the template.
  
      The source part of the returned tuple must be the source of the
      template as a string. The filename should be the name of the
      file on the filesystem if it was loaded from there, otherwise
      ``None``. The filename is used by Python for the tracebacks
      if no loader extension is used.
  
      The last item in the tuple is the `uptodate` function.  If auto
      reloading is enabled it's always called to check if the template
      changed.  No arguments are passed so the function must store the
      old state somewhere (for example in a closure).  If it returns `False`
      the template will be reloaded.
      """
      if not self.has_source_access:
          raise RuntimeError(
              f"{type(self).__name__} cannot provide access to the source"
          )
      raise TemplateNotFound(template)
  
imports: import importlib.util
  import os
  import posixpath
  import sys
  import pkgutil
  import typing
  import weakref
  import zipimport
  from collections import abc
  from hashlib import sha1
  from importlib import import_module
  from types import ModuleType
  from .exceptions import TemplateNotFound
  from .utils import internalcode
  from .utils import open_if_exists
  import __res
label_desc: Use image node_id 1 for calling the BaseLoader obj's underlying member method code with example usage: obj.get_source(environment, template) without return types