Для отображения контента на стороне frontend одним из самых популярных и простых в исспользовании модулей является frontend шаблонизатор Jinja Django.
Jinja уже встроен в Flask и Django, дополнительно его устанавливать нет необходимости, официальная документация Jinja находится здесь.
Но все же, если вы не исспользуете выше названные фраемворки, то установить его можно через терминал, командой:
pip install Jinja
Основная задача модуля – это преобразование тектовых шаблонов, с чем он справляется просто отлично!
Отображение данных в Jinja
Для общего понимания, как работает модель Jinja:
from jinja2 import Template name = "Иван" age = 30 tm = Template("Мне {{ a }} лет и зовут меня {{ n }}") msg = tm.render(n=name, a=age) print(msg)
Здесь мы видим не привычное нам – {{ }}, как раз в двойных фигурных скобках можно писать:
- {%%} – спецификатор шаблона;
- {{ }} – выражение для вставки конструкции Python в шаблон;
- {##} – блок коминтариев.
Обратите внимание на именованные параметры в методе render, они воспринимаются как словарь, где ключи в моем примере это “n” и “a”, а значения – объекты переменных name и age.
Кстати, внутри этих фигурных скобок можно применять математические операции, если значение позволяет, или, если значение имеет тип данных строка, то можно применять методы строк в Python.
tm = Template("Мне {{ a*2 }} лет и зовут меня {{ n.upper() }}") # Мне 60 лет и зовут меня ИВАН
Услажним немного наш код, перепишем с применением классов:
class Person: def __init__(self, name, age): self.name = name self.age = age person = Person("Иван", 30) tm = Template("Мне {{ p.age }} лет и зовут меня {{ p.name }}") msg = tm.render(p = person) print(msg) # Мне 30 лет и зовут меня Иван
Когда мы что-то передаем в метод render, в нашем случае это p = person
, то во внутрь шаблоно этот атрибут попадает по ссылке, в нашем случае по p.
Или, второй пример, как работает шаблонизатор Jinja Django:
class Person: def __init__(self, name, age): self.name = name self.age = age def getName(self): return self.name def getAge(self): return self.age person = Person("Иван", 30) tm = Template("Мне {{ p.getAge() }} лет и зовут меня {{ p.getName() }}") msg = tm.render(p = person) print(msg) # Мне 30 лет и зовут меня Иван
Но, не стоит забывать о таком типе данных, как dict – он очень часто здесь применяется, и в шаблон мы можем тоже передавать данные прям со словаря:
from jinja2 import Template person = {'name': 'Иван', 'age': 30} tm = Template("Мне {{ p.age }} лет и зовут меня {{ p.name }}") msg = tm.render(p=person) print(msg) # Мне 30 лет и зовут меня Иван
Или же, получить значения можно обращаясь по ключам:
tm = Template("Мне {{ p['age'] }} лет и зовут меня {{ p['name'] }}")
Экранирование данных в строках, модуль Jinja
Один из самых часто применяемых способов экранирования – использование класса escape
:
from markupsafe import escape link = '''Как показать ссылку в <a href="#">Ссылка</a> HTML документе''' msg = escape(link) print(msg)
Также, есть возможность выполнять экранирование используя конструкцию {% raw %} .... {% endraw %}
, и все, что помещается внутрь этой конструкции – будет экранировано:
link = '''{% raw %}Как показать ссылку в <a href="#">Ссылка</a> HTML документе{% endraw %}''' tm = Template(link) msg = tm.render() print(msg)
Знак минус в конце тега очищает все пробелы и новые строки, предшествующие первому символу ваших необработанных данных. {% raw -%}
Иногда, можно встретить внутри фигурных скобок и другие флаги, например флаг “e” также выполняет экранирование строк, а точнее специальных символов, таких как <,>,#,</>:
from jinja2 import Template link = '''Как показать ссылку в <a href="#">Ссылка</a> HTML документе''' tm = Template("{{ link | e }}") msg = tm.render(link=link) print(msg)
О том, как отображать элементы списков на странице html, логические конструкции и многое другое, читайте в нашей следующей статье здесь.