Jinja (template engine)
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.
![]()  | |
| Original author(s) | Armin Ronacher | 
|---|---|
| Initial release | July 17, 2008[1] | 
| Stable release | |
| Repository | |
| Written in | Python | 
| Type | Template engine | 
| License | BSD License | 
| Website | palletsprojects | 
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]
Features
    
Some of the features of Jinja are:[10]
- sandboxed execution
 - automatic HTML escaping to prevent cross-site scripting (XSS) attacks
 - template inheritance
 - compiles down to the optimal Python code just-in-time
 - optional ahead-of-time template compilation
 - easy to debug (for example, line numbers of exceptions directly point to the correct line in the template)
 - configurable syntax
 
Jinja, like Smarty, also ships with an easy-to-use filter system similar to the Unix pipeline.
Syntax
    
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 hashtag (#) 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.
Example
    
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>
Sources
    
- "Jinja2 Release History". Retrieved 24 June 2020.
 - "Release 3.1.2".
 - "Extensions". Jinja2 Documentation (2.8-dev). Retrieved 2015-05-26.
 - "Jinja built-in filters and tests (like Django filters)". www.webforefront.com. Retrieved 2023-08-14.
 - "Extensions". Jinja2 Documentation (2.8-dev). Retrieved 2015-05-26.
 - DuPlain, R. (2013). Instant Flask Web Development. Packt Publishing. p. 30. ISBN 978-1-78216-963-5. Retrieved 2015-05-26.
 - "Templating (Jinja2) — Ansible Documentation".
 - "Understanding Jinja". docs.saltproject.io.
 - Jinja and macros | dbt Developer Hub
 - "Welcome | Jinja2 (The Python Template Engine)". palletsprojects.com/p/jinja.
 -  Ronacher, Armin. "Template Designer Documentation". Jinja2 Documentation. Retrieved 7 January 2016. 
A Jinja template doesn't need to have a specific extension: .html, .xml, or any other extension is just fine.
 
