Python Jinja2

Posted by chunyang on May 16, 2022
TAGS: #python

Jinja2 is a fast, expressive, extensible templating engine. This blog records the problems or requirements I met during my development.

Basic usage

  • {{...}} for expressions
  • {% ... %} for statements
  • {# ... #} for comments

Jinja2 placeholders are wrapped with double curly braces.

Use strings as templates

from jinja2 import Template

content = "{{apple_cnt}}"
template = Template(content)

result = template.render(apple_cnt=3)
print(result)

Use a folder as templates sources

from jinja2 import Envrionment, PackageLoader

env = Environment(
    loader=PackageLoader("package_name", "path/to/templates"),
)
template = env.get_template("a.html")

We may package templates with our published packages, using package_data in setup.py. Reference

from jinja2 import Envrionment, FileSystemLoader

env = Environment(
    loader=FileSystemLoader(["/path/to/A"])
)
template = env.get_template("a.html")

Get templates for a folder from file system.

Advanced usage

Comment

{# This is a comment #}

Raise error if certain key not found

from jinja2 import Envrionment, FileSystemLoader

def raise_helper(msg):
    raise Exception(msg)

env = Environment(
    loader=FileSystemLoader(["/path/to/A"])
)

env.globals["raise"] = raise_helper

template = env.get_template("a.html")

We can add following template code, calling our predefined raise_helper

{% if app_name is none or app_name|length < 1 %}
{{ raise("app_name must be set") }}
{% endif %}

env is a dict.

{% for key, value in env.items() %}
{% endfor %}

A: env["HOST_IP"]
{% if "HOSTNAME" in env %}
B: env["HOSTNAME"]
{% else %}
B: "UNKNOWN"
{% endif %}

is mapping is a test.

Jinja2 tests

  • mapping
  • sequence
  • string
  • integer
  • float
  • callable
  • iterable

Trim empty spaces and blocks

By default {% else %} or similar expression will be empty blocks after render.

from jinja2 import Environment, Template
template = "{{apple_cnt}}"
Template(template, trim_blocks=True, lstrip_blocks=True)

env = Environment(
    loader=PackageLoader("package_name", "path/to/templates"),
    trim_blocks=True,
    lstrip_blocks=True,
)

Default value

{{replicas|default(1, true)}}

default

The second bool is required if the variable may be evaluated to false which means false is a valid value.

Jinja2 filters

autoescape

Autoescape

Keep double quotation in string, not escaped.

from jinja2 import Template, select_autoescape

t = """
{% autoescape false %}
b: {{cnt}}
{% endautoescape %}
"""

template = Template(t)

result = template.render(cnt='"3"')
print(result)

If we set false to true for autoescape, we will get

b: &#34;3&#34;
from jinja2 import Template
from jinja2.utils import select_autoescape

t = """
b: {{cnt}}
"""

template = Template(t, autoescape=select_autoescape(default_for_string=False))

result = template.render(cnt='"3"')
print(result)

Create variables

{% set a = 3 %}

Reference