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 %}
Dict related variable
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.
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)}}
The second bool is required if the variable may be evaluated to false
which means false
is a valid value.
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: "3"
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 %}