В этом уроке вы узнаете, что такое шаблонизаторы и как работать с ними.
Зачем нужны шаблонизаторы
Для начала посмотрим на такой пример кода:
@app.route('/')
def root():
return 'Main Page'
В этом примере в ответ на запрос главной страницы обработчик отдаст строчку 'Main Page'
. Такой пример хорошо подходит для демонстрации, но обычно браузер ожидает HTML-страницу. Причем страница может быть достаточно большой — десятки и сотни килобайтов. А теперь попробуем создавать HTML так:
@app.route('/')
def root():
title = 'My super site'
return f'<html><body><h1>{title}</h1></body></html>'
Такой код достаточно быстро превратится в нечто нечитаемое. Для работы с HTML во фреймворках используют специальные библиотеки — шаблонизаторы. Принцип их работы такой:
- В отдельном файле заранее описывается шаблон
- Во время работы программы шаблон загружается и превращается в HTML
При этом шаблон может содержать как обычные HTML-тэги, так и специальную разметку. Она позволяет подставлять в HTML значения, отображать и прятать отдельные фрагменты по условию, размножать фрагменты в цикле, и тому подобное. Вот пример шаблона для популярного шаблонизатора Jinja:
{% extends "email-html_base.tmpl" %}
{% block content %}
<p>
{{ msg }}
</p>
<p>
<b>AFFECTED INSTANCES:</b>
</p>
<table class='noborder'>
<tr>
<th>UUID</th><th>IP Address</th><th>Host</th>
</tr>
{% for instance in instances -%}
<tr>
<td>{{ instance.id }}</td>
<td>{{ instance.access_ip_v4 }}</td>
<td>{{ instance.name }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
При чтении такого шаблона библиотека подставляет переменные и выполняет код логики каждый раз. Это позволяет использовать один и тот же шаблон для выдачи разных страниц, отличающихся только частью содержимого (чаще всего — подставляемыми переменными). Стоит отметить, что многие шаблонизаторы можно использовать для формирования произвольных текстов, а не только HTML.
Безопасность
Об этом редко говорят во время обучения, но безопасность крайне важна при работе с HTML-формами и шаблонами в целом. Не понимая основ защиты, вы можете сделать ошибку, которая приведет к фатальным последствиям для проекта. Например, отсутствие экранирования пользовательских данных приведет к тому, что у злоумышленника появится возможность провести XSS-атаку.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.