Using Jinja With Python

Posted September 30, 2022 by Rohith ‐ 4 min read

In this article we will shows how to create templates in Python with Jinja module.

Python Jinja module

Jinja is a template engine for Python. It is used in django, airflow in many other frameworks.

What is a template engine?

A template engine or template processor is a library designed to combine templates with a data model to produce documents. Template engines are often used to generate large amounts of emails, in source code preprocessing, or producing dynamic HTML pages.

We create a template engine, where we define static parts and dynamic parts. The dynamic parts are later replaced with data. The rendering function later combines the templates with data.

Jinja installation

Jinja package can be installed using pip3 utility

pip3 install jinja2

Jinja delimiters

Jinja uses various delimiters in the template strings.

  • {% %} - statements
  • {{ }} - expressions to print to the template output
  • {# #} - comments which are not included in the template output
  • # ## - line statements

Jinja simple example

In the first example, we create a very simple template.

example1.py

#!/usr/bin/python

from jinja2 import Template

name = 'sde.whiletrue.live'

template = Template("Hello {{ name }}")
message = template.render(name=name)

print(message)

In the above example, name variable will be replaced with the value.

The template engine is similar to the Python format method. But template engines are more powerful and have many more features.

example2.py

#!/usr/bin/python

from jinja2 import Template

domain = 'whiletrue.live'
subdomain = 'sde'

template = Template("domain name is {{ domain }} and subdomain name is {{ subdomain }}")
message = tm.render(domain=domain, subdomain=subdomain)

print(message)

The template string renders two variables: domain and subdomain

Jinja objects

We can work with objects in our template strings.

In the below example, we defined a Website object. We get the domain and subdomain via the two getters.

jinja_object_example.py

#!/usr/bin/python

from jinja2 import Template

class Website:

    def __init__(self, domain, subdomain):

        self.domain = name
        self.subdomain = subdomain

    def getDomain(self):
        return self.domain

    def getSubdomain(self):
        return self.subdomain    


website = Website('whiletrue.live', 'sde')

template = Template("domain name is {{ website.domain }} and subdomain name is {{ website.subdomain }}")
message = template.render(website=website)

print(message)

Using Python Dictionaries

Jinja allows a convenient dot notation to access data in Python dictionaries.

Example

#!/usr/bin/python

from jinja2 import Template

website = { 'domain': 'whiletrue.live', 'subdomain': 'sde' }

template = Template("domain name is {{ website.domain }} and subdomain name is {{ website.subdomain }}")
message = template.render(website=website)

print(message)

We have a website dictionary. We access the dictionary keys with a dot operator.

Jinja raw data

We can use raw, endraw markers to escape Jinja delimiters.

By using the raw, endraw block, we escape the Jinja {{ }} syntax. It is printed in its literal meaning.

Example

#!/usr/bin/python

from jinja2 import Template

data = '''
{% raw %}
The website name is {{ website_name }}
{% endraw %}
'''

template = Template(data)
message = template.render(website_name='whiletrue.live')

print(message)

Jinja escape data

To escape data such as < or > characters, we can use a filter or the escape function.

Example: The below example escapes < and > characters.

#!/usr/bin/python

from jinja2 import Template, escape

data = '<a>whiletrue.live is awesome</a>'

template = Template("{{ data | e}}")
message = template.render(data=data)

print(message)
print(escape(data))

Jinja for expressions

The for expression is used to iterate over a data collection in a template.

Now we do not use a simple string template anymore. We use a text file which is loaded with FileSystemLoader.

Example

#!/usr/bin/python

from jinja2 import Environment, FileSystemLoader

websites = [
    {'domain': 'whiletrue.live', 'subdomain': 'sde'}, 
    {'domain': 'whiletrue.live', 'subdomain': 'dentistry'}
]

file_loader = FileSystemLoader('templates')
env = Environment(loader=file_loader)

template = env.get_template('show_websites.txt')

output = template.render(websites=websites)
print(output)

In the template file, we use the for expression to iterate over the collection. We show the domain and the respective subdomain. The dash character next to the % characters is used to control white space.

{% for website in websites -%}
    {{ website.domain }} {{ website.subdomain }}
{% endfor %}

Jinja conditionals

Conditionals are expressions that are evaluated when a certain condition is met.

Example

{% for website in websites %}
    {% if website.subdomain == 'sde' %}
        {{- website.subdomain }}
    {% endif %}    
{%- endfor %}
quick-references blog

Subscribe For More Content