(Py) Moduł Jinja2*

Moduł Jinja2

  • Moduł Jinja2 umożliwia z-formatowanie otrzymanego ciągu znaków w taki sposobu, aby zawarte w nim znaki specjalne zostały zamienione na zmienne, wyrażenia logicznie (np. if), pętle (np. for) i inne konstrukcję języka Python.
  • Link do dokumentacji.

Budowa pliku Jinja2

  • {{ zmienna }} – Pobiera wskazaną zmienną, wstawiając ją w ciągu znaków.
  • {% warunek logiczny %} – Warunek logiczny IF.
    • {% if wyrażenie %} – Rozpoczyna warunek logiczny IF.
    • {% elif wyrażenie %} – Dodaje warunek logiczny ELIF.
    • {% else %} – Dodaje warunek Logiczny ELSE.
    • {% endif %} – Kończy warunek logiczny IF.
  • {% pętla %} – Pętle FOR.
    • {% for zmienna in obiekt %} – Rozpoczyna pętle FOR.
    • {% endfor %} – Kończy pętle FOR.
  • {{ zmienna|formatowanie }} – Definiuje funkcję formatującą wskazaną zmienną. Np. upper().
  • {% include file.j2′ %} – Importuje zawartość innego pliku j2, do obecnie edytowanego pliku j2.

Pętla for

  • {% for zmienna in obiekt %} – Rozpoczyna pętle FOR.
    • {% if loop.index == loop.length %} – Dotyczy ostatniego obiektu w pętli FOR.
    • {% endif %} – Kończy warunek logiczny IF.
  • {% endfor %} – Kończy pętle FOR.

Zmienne pętli for

  • loop.index – The current iteration of the loop. (1 indexed)
  • loop.index0 – The current iteration of the loop. (0 indexed)
  • loop.revindex – The number of iterations from the end of the loop (1 indexed)
  • loop.revindex0 – The number of iterations from the end of the loop (0 indexed)
  • loop.first – True if first iteration.
  • loop.last – True if last iteration.
  • loop.length – The number of items in the sequence.
  • loop.cycle – A helper function to cycle between a list of sequences. See the explanation below.
  • loop.depth – Indicates how deep in a recursive loop the rendering currently is. Starts at level 1
  • loop.depth0 – Indicates how deep in a recursive loop the rendering currently is. Starts at level 0
  • loop.previtem – The item from the previous iteration of the loop. Undefined during the first iteration.
  • loop.nextitem – The item from the following iteration of the loop. Undefined during the last iteration.
  • loop.changed(*val) – True if previously called with a different value (or not called at all).

Filtry

Wykorzystanie filtrów

  • {{ zmienna|filtr }} – Pobiera wskazaną zmienną, wstawiając ją w ciągu znaków. Opcjonalny filtr umożliwia dodatkową obróbkę wartości zmiennej.
    • capitalize – Zmienia wszystkie litery na duże.
    • lower – Zmienia wszystkie litery na małe.

Wbudowane filtry Python

  • abs(), float(), lower(), round(), tojson(), attr(), forceescape(), map(), safe(), trim(), batch(), format(), max(), select(), truncate(), capitalize(), groupby(), min(), selectattr(), unique(), center(), indent(), pprint(), slice(), upper(), default(), int(), random(), sort(), urlencode(), dicts, ort(), join(), reject(), string(), urlize(), escape(), last(), rejectattr(), striptags(), wordcount(), filesizeformat(), length(), replace(), sum(), wordwrap(), first(), list(), reverse(), title(), xmlattr().

Linki do dokumentacji

Przykładowe zastosowanie modułu Jinja2

Podstawowe użycie modułu Jinja2

Przykładowa zawartość pliki j2:

{% for x in range(10) %}interface {{ interface.name }} {{ x+1 }}
 description {{ interface.description }}{% if x+1 == 1 %}
 switchport trunk{% else %}
 switchport mode access 
 switchport access vlan {{ interface.vlan }}{% endif %}
{% endfor %}
Przykładowy kod modułu Jinja2, pobiera dane z pliku .j2:

from jinja2 import Template

data_dict = {
	"name":"Gigabitethernet",
	"description":"Opis interfejsu",
	"vlan":10,
	"mode":"access"
}

# Pobranie zawartości pliku j2 do listy:
with open("jinja.j2", "r") as file:
	file_content = file.read()

template = Template(file_content)

# Wyświetla z-formatowaną zawartość pliku j2:
print(template.render(interface=data_dict))
Przykładowy kod modułu Jinja2, pobiera dane z pliku .j2 przy użyciu funkcji modułu Jinja2:

from jinja2 import Environment , FileSystemLoader

data_dict = {
	"name":"Gigabitethernet",
	"description":"Opis interfejsu",
	"vlan":10,
	"mode":"access"
}

# Environment - Określa lokalizację pliku j2, wartość '.' oznacza że plik znajduje się w tym samym folderze:
ENV = Environment(loader=FileSystemLoader('.'))

# Pobranie zawartości pliku j2:
template = ENV.get_template("jinja.j2")

# Wyświetlenie z-formatowanej zawartość pliku j2:
print(template.render(interface=data_dict))

Pobieranie informacji o wielu interfejsach ze słownika

Przykładowa zawartość pliki j2:

{% for interface in interface_list %}interface {{ interface.name }}
 description {{ interface.description|upper }}{% if interface.uplink %}
 switchport trunk{% else %}
 switchport mode access
 switchport access vlan {{ interface.vlan }}{% endif %}
{% endfor %}
Przykładowy kod modułu Jinja2, uzupełniający dane pobrane ze słownika:

from jinja2 import Environment , FileSystemLoader

# Environment - Określa lokalizację pluku j2, wartość '.' oznacza że plik znajduje się w tym samym folderze:
ENV = Environment(loader=FileSystemLoader('.'))

# Pobranie zawartości pliku j2:
template = ENV.get_template("jinja.j2")

interface_list = [
	{"name":"Gigabitethernet1", "description":"Opis interfejsu", "uplink":True},
	{"name":"Gigabitethernet2", "description":"Opis interfejsu", "uplink":False, "vlan":10},
	{"name":"Gigabitethernet3", "description":"Opis interfejsu", "uplink":False, "vlan":20},
	{"name":"Gigabitethernet4", "description":"Opis interfejsu", "uplink":False, "vlan":30}
]

print(template.render(interface_list=interface_list))

Własna funkcja formatująca

Przykładowa zawartość pliki j2:

{% for interface in interface_list %}interface {{ interface.name }}
 description {{ interface.description|upper }}{% if interface.uplink %}
 switchport trunk{% else %}
 switchport mode access
 switchport access vlan {{ interface.vlan }}{% endif %}
 speed {{ interface.name|custom_filter_function }}
{% endfor %}
Przykładowa skastomizowana funkcja modułu Jinja2:

from jinja2 import Environment , FileSystemLoader

# Environment - Określa lokalizację pliku j2, wartość '.' oznacza że plik znajduje się w tym samym folderze:
ENV = Environment(loader=FileSystemLoader('.'))

def custom_filter_function(interface_name):
	if "gigabit" in interface_name.lower():
		return 1000
	elif "fast" in interface_name.lower():
		return 100
	elif "ethernet" in interface_name.lower():
		return 10

# Atkywacja własnego filra:
ENV.filters['custom_filter_function'] = custom_filter_function

# Pobranie zawartości pliku j2:
template = ENV.get_template("jinja.j2")

interface_list = [
	{"name":"Gigabitethernet1", "description":"Opis interfejsu", "uplink":True},
	{"name":"Fastethernet2", "description":"Opis interfejsu", "uplink":False, "vlan":10},
	{"name":"Ethernet3", "description":"Opis interfejsu", "uplink":False, "vlan":20},
	{"name":"Gigabitethernet4", "description":"Opis interfejsu", "uplink":False, "vlan":30}
]

print(template.render(interface_list=interface_list))

Pozostałe tematy związane z bibliotekami / modułami Python

Podstawowe

Rozszerzone

SQL

PyQt 5

Automatyzacja

Data Mining

PDFPRINT

Robert T Kucharski

Cisco Network Engineer in GPW.

1 Response

  1. 2 maja 2020

    […] Moduł Jinja2 [] – […]

Dodaj komentarz