Source code for pyechonext.template_engine.jinja
from os.path import exists, getmtime, join
from jinja2 import BaseLoader, Environment, TemplateNotFound, select_autoescape
from pyechonext.logging import logger
from pyechonext.request import Request
[docs]
class TemplateLoader(BaseLoader):
"""
This class describes a jinja2 template loader.
"""
[docs]
def __init__(self, path: str):
"""
Constructs a new instance.
:param path: The path
:type path: str
"""
self.path = path
[docs]
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)
[docs]
class TemplateEngine:
"""
This class describes a jinja template engine.
"""
[docs]
def __init__(self, base_dir: str, templates_dir: str):
"""
Constructs a new instance.
:param base_dir: The base dir
:type base_dir: str
:param templates_dir: The templates dir
:type templates_dir: str
"""
self.base_dir = base_dir
self.templates_dir = join(base_dir, templates_dir)
self.env = Environment(
loader=TemplateLoader(self.templates_dir), autoescape=select_autoescape()
)
[docs]
def build(self, template_name: str, **kwargs):
template = self.env.get_template(template_name)
return template.render(**kwargs)
[docs]
def render_template(request: Request, template_name: str, **kwargs) -> str:
"""
Render template
:param request: The request
:type request: Request
:param template_name: The template name
:type template_name: str
:param kwargs: The keywords arguments
:type kwargs: dictionary
:returns: raw template string
:rtype: str
:raises AssertionError: BASE_DIR and TEMPLATES_DIR is empty
"""
assert request.settings.BASE_DIR
assert request.settings.TEMPLATES_DIR
engine = TemplateEngine(request.settings.BASE_DIR,
request.settings.TEMPLATES_DIR)
logger.debug(
f"Jinja2 template engine: render {template_name} ({request.path})")
return engine.build(template_name, **kwargs)