Software:Jinja (template engine)

From HandWiki
Short description: Template engine for the Python programming language associated with the Flask framework
Jinja
Jinja software logo.svg
Original author(s)Armin Ronacher
Initial releaseJuly 17, 2008; 15 years ago (2008-07-17)[1]
Written inPython
TypeTemplate engine
LicenseBSD License

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,[2] filters (for formatting or transforming values[3]), tests (for evaluating conditions[3]), and globals.[4] 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 [5] and it is also used by Ansible,[6] Trac, and Salt.[7] It is also used to make SQL macros, for example for use with dbt.[8]

Features

Some of the features of Jinja are:[9]

  • 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 }}).[3]

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 %}).[3]

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 %}
{% endfor %}

Although Template:Python and Template:Python are not allowed inside loops, sequences can be filtered.

Example

Here is a small example of a template file example.html.jinja:[10]

<!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 &lt;unsafe&gt; 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.[11]

Sources

External links