Original author(s) | Armin Ronacher |
---|---|
Initial release | July 17, 2008[1] |
Stable release | 3.1.4
[2]
/ 5 May 2024 |
Repository | |
Written in | Python |
Type | Template engine |
License | BSD License |
Website |
palletsprojects |
Jinja is a web template engine for the Python programming language. It was created by Armin Ronacher and is licensed under a BSD License. Jinja is similar to the Django template engine but provides Python-like expressions while ensuring that the templates are evaluated in a sandbox. It is a text-based template language and thus can be used to generate any markup as well as source code.
The Jinja template engine allows customization of tags, [3] filters (for formatting or transforming values [4]), tests (for evaluating conditions [4]), and globals. [5] Also, unlike the Django template engine, Jinja allows the template designer to call functions with arguments on objects. Jinja is Flask's default template engine [6] and it is also used by Ansible, [7] Trac, and Salt. [8] It is also used to make SQL macros, for example for use with dbt. [9]
Some of the features of Jinja are: [10]
Jinja, like Smarty, also ships with an easy-to-use filter system similar to the Unix pipeline.
The syntax for printing output in Jinja is using the double curly braces, for example {{ Hello, World! }}
.
Statements which set variables in jinja or those which do not have an output can be wrapped within {%
and %}
, using the set
keyword. For example {% set foo = 42 %}
sets a variable called foo
with a value of 42.
Similar to above, comments in jinja can be written using a number sign (#
) instead of a percentage (%
), for example, {# helpful comment #}
.
The syntax for creating a filter in Jinja is a
vertical bar (|
), for example {{ variable|filter }}
. A variable can have multiple filters, for example {{ variable|filter|filter }}
).
[4]
The syntax for creating a test in Jinja is the keyword is
as well as the conditions for evaluating the validity of a test, such as for example {% if variable is divisibleby 10 %}do something{% endif %}
).
[4]
For loops can be used to iterate over sequences, while retaining their object properties. The following example demonstrates iterating over a list of users with username
and password
fields.
{% for user in users %}
{{ user.username }}
{{ user.password }}
{% endfor %}
Although break
and continue
are not allowed inside loops, sequences can be filtered.
Here is a small example of a template file example.html.jinja
:
[11]
<!DOCTYPE html>
<html>
<head>
<title>{{ variable|escape }}</title>
</head>
<body>
{%- for item in item_list %}
{{ item }}{% if not loop.last %},{% endif %}
{%- endfor %}
</body>
</html>
and templating code:
from jinja2 import Template
with open('example.html.jinja') as f:
tmpl = Template(f.read())
print(tmpl.render(
variable = 'Value with <unsafe> data',
item_list = 1, 2, 3, 4, 5, 6
))
This produces the HTML string:
<!DOCTYPE html>
<html>
<head>
<title>Value with <unsafe> data</title>
</head>
<body>
1,
2,
3,
4,
5,
6
</body>
</html>
Note the
minus sign (-
) after the tag {%
: If you add a minus sign (-
) to the start or end of a block (e.g. a For tag), a comment, or a variable expression, the whitespaces before or after that block will be removed.
[12]
A Jinja template doesn't need to have a specific extension: .html, .xml, or any other extension is just fine.
Original author(s) | Armin Ronacher |
---|---|
Initial release | July 17, 2008[1] |
Stable release | 3.1.4
[2]
/ 5 May 2024 |
Repository | |
Written in | Python |
Type | Template engine |
License | BSD License |
Website |
palletsprojects |
Jinja is a web template engine for the Python programming language. It was created by Armin Ronacher and is licensed under a BSD License. Jinja is similar to the Django template engine but provides Python-like expressions while ensuring that the templates are evaluated in a sandbox. It is a text-based template language and thus can be used to generate any markup as well as source code.
The Jinja template engine allows customization of tags, [3] filters (for formatting or transforming values [4]), tests (for evaluating conditions [4]), and globals. [5] Also, unlike the Django template engine, Jinja allows the template designer to call functions with arguments on objects. Jinja is Flask's default template engine [6] and it is also used by Ansible, [7] Trac, and Salt. [8] It is also used to make SQL macros, for example for use with dbt. [9]
Some of the features of Jinja are: [10]
Jinja, like Smarty, also ships with an easy-to-use filter system similar to the Unix pipeline.
The syntax for printing output in Jinja is using the double curly braces, for example {{ Hello, World! }}
.
Statements which set variables in jinja or those which do not have an output can be wrapped within {%
and %}
, using the set
keyword. For example {% set foo = 42 %}
sets a variable called foo
with a value of 42.
Similar to above, comments in jinja can be written using a number sign (#
) instead of a percentage (%
), for example, {# helpful comment #}
.
The syntax for creating a filter in Jinja is a
vertical bar (|
), for example {{ variable|filter }}
. A variable can have multiple filters, for example {{ variable|filter|filter }}
).
[4]
The syntax for creating a test in Jinja is the keyword is
as well as the conditions for evaluating the validity of a test, such as for example {% if variable is divisibleby 10 %}do something{% endif %}
).
[4]
For loops can be used to iterate over sequences, while retaining their object properties. The following example demonstrates iterating over a list of users with username
and password
fields.
{% for user in users %}
{{ user.username }}
{{ user.password }}
{% endfor %}
Although break
and continue
are not allowed inside loops, sequences can be filtered.
Here is a small example of a template file example.html.jinja
:
[11]
<!DOCTYPE html>
<html>
<head>
<title>{{ variable|escape }}</title>
</head>
<body>
{%- for item in item_list %}
{{ item }}{% if not loop.last %},{% endif %}
{%- endfor %}
</body>
</html>
and templating code:
from jinja2 import Template
with open('example.html.jinja') as f:
tmpl = Template(f.read())
print(tmpl.render(
variable = 'Value with <unsafe> data',
item_list = 1, 2, 3, 4, 5, 6
))
This produces the HTML string:
<!DOCTYPE html>
<html>
<head>
<title>Value with <unsafe> data</title>
</head>
<body>
1,
2,
3,
4,
5,
6
</body>
</html>
Note the
minus sign (-
) after the tag {%
: If you add a minus sign (-
) to the start or end of a block (e.g. a For tag), a comment, or a variable expression, the whitespaces before or after that block will be removed.
[12]
A Jinja template doesn't need to have a specific extension: .html, .xml, or any other extension is just fine.