class_docstr: A loader that looks for templates in the application and all
  the blueprint folders.
class_docstr_tok: ["A","loader","that","looks","for","templates","in","the","application","and","all","the","blueprint","folders","."]
code: def _get_source_explained(
      self, environment: Environment, template: str
  ) -> tuple[str, str | None, t.Callable | None]:
      attempts = []
      rv: tuple[str, str | None, t.Callable[[], bool] | None] | None
      trv: None | (
          tuple[str, str | None, t.Callable[[], bool] | None]
      ) = None
  
      for srcobj, loader in self._iter_loaders(template):
          try:
              rv = loader.get_source(environment, template)
              if trv is None:
                  trv = rv
          except TemplateNotFound:
              rv = None
          attempts.append((loader, srcobj, rv))
  
      from .debughelpers import explain_template_loading_attempts
  
      explain_template_loading_attempts(self.app, template, attempts)
  
      if trv is not None:
          return trv
      raise TemplateNotFound(template)
  
imports: from __future__ import annotations
  import typing
  from jinja2 import BaseLoader
  from jinja2 import Environment
  from jinja2 import Template
  from jinja2 import TemplateNotFound
  from .globals import _cv_app
  from .globals import _cv_request
  from .globals import current_app
  from .globals import request
  from .helpers import stream_with_context
  from .signals import before_render_template
  from .signals import template_rendered
label_desc: Use image node_id 3 for calling the DispatchingJinjaLoader obj's underlying member method code with example usage: obj._get_source_explained(environment, template) and returns: trv