0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Формирование HTML во фреймворках - отдельная нетривиальная тема. Можно создавать HTML напрямую в виде строки, но такой способ перестает работать на реальных сайтах, где HTML одной страницы - это сотни или тысячи строк. Чтобы упростить работу с HTML, используют шаблонизаторы. В этом уроке мы познакомимся с ними подробнее.</p>
1
<p>Формирование HTML во фреймворках - отдельная нетривиальная тема. Можно создавать HTML напрямую в виде строки, но такой способ перестает работать на реальных сайтах, где HTML одной страницы - это сотни или тысячи строк. Чтобы упростить работу с HTML, используют шаблонизаторы. В этом уроке мы познакомимся с ними подробнее.</p>
2
<h2>HTML в виде строки - плохой подход</h2>
2
<h2>HTML в виде строки - плохой подход</h2>
3
<p>Представим, что мы создаем HTML-страницу в виде строки:</p>
3
<p>Представим, что мы создаем HTML-страницу в виде строки:</p>
4
<p>У такого подхода много недостатков:</p>
4
<p>У такого подхода много недостатков:</p>
5
<ul><li>Он небезопасен и может привести к взлому</li>
5
<ul><li>Он небезопасен и может привести к взлому</li>
6
<li>С ростом количества HTML поддерживать такой код станет практически невозможно из-за неудобства анализа и редактирования</li>
6
<li>С ростом количества HTML поддерживать такой код станет практически невозможно из-за неудобства анализа и редактирования</li>
7
<li>В таком коде будут возникать постоянные проблемы - придется экранировать одинарные или двойные кавычки</li>
7
<li>В таком коде будут возникать постоянные проблемы - придется экранировать одинарные или двойные кавычки</li>
8
<li>В таком коде легко допустить ошибку в HTML и сложно ее обнаружить</li>
8
<li>В таком коде легко допустить ошибку в HTML и сложно ее обнаружить</li>
9
<li>В типичных сайтах большая часть HTML общая для разных страниц. Выделить ее с этим подходом очень сложно</li>
9
<li>В типичных сайтах большая часть HTML общая для разных страниц. Выделить ее с этим подходом очень сложно</li>
10
</ul><p>Чтобы решать подобные проблемы, придумали шаблонизаторы.</p>
10
</ul><p>Чтобы решать подобные проблемы, придумали шаблонизаторы.</p>
11
<h2>Шаблонизаторы</h2>
11
<h2>Шаблонизаторы</h2>
12
<p><strong>Шаблонизаторы</strong>- специализированные библиотеки, которые позволяют описывать шаблон отдельно от остальной части кода. Мы будем использовать Jinja2, который по умолчанию установлен во Flask.</p>
12
<p><strong>Шаблонизаторы</strong>- специализированные библиотеки, которые позволяют описывать шаблон отдельно от остальной части кода. Мы будем использовать Jinja2, который по умолчанию установлен во Flask.</p>
13
<p>Чтобы использовать шаблонизатор Jinja2, его нужно подключить:</p>
13
<p>Чтобы использовать шаблонизатор Jinja2, его нужно подключить:</p>
14
<p>Функция render_template() выполняет рендеринг указанного шаблона и добавляет результат в ответ. Сама функция принимает на вход два параметра:</p>
14
<p>Функция render_template() выполняет рендеринг указанного шаблона и добавляет результат в ответ. Сама функция принимает на вход два параметра:</p>
15
<ol><li>Путь до нужного шаблона</li>
15
<ol><li>Путь до нужного шаблона</li>
16
<li>Контекст - набор именованных аргументов, который будет доступен внутри шаблона. Сюда можно передавать все что угодно.</li>
16
<li>Контекст - набор именованных аргументов, который будет доступен внутри шаблона. Сюда можно передавать все что угодно.</li>
17
</ol><p>Далее добавляем файл<em>templates/index.html</em>со следующим содержимым:</p>
17
</ol><p>Далее добавляем файл<em>templates/index.html</em>со следующим содержимым:</p>
18
<p>Теперь откройте браузер и попробуйте загрузить страницу<em><a>http://localhost</a></em></p>
18
<p>Теперь откройте браузер и попробуйте загрузить страницу<em><a>http://localhost</a></em></p>
19
<p><em><a>/users/nick</a></em>.</p>
19
<p><em><a>/users/nick</a></em>.</p>
20
<p>Вместо кода {{ name }} на экране появилось значение аргумента name. Шаблонизатор берет весь контекст, который приводится после названия шаблона, и создает внутри шаблона локальные переменные. При этом имя локальной переменной и имя передаваемого именованного аргумента совпадают. Этот принцип работает всегда. Затем все переданные контекстом переменные подставляются в их плейсхолеры в шаблоне.</p>
20
<p>Вместо кода {{ name }} на экране появилось значение аргумента name. Шаблонизатор берет весь контекст, который приводится после названия шаблона, и создает внутри шаблона локальные переменные. При этом имя локальной переменной и имя передаваемого именованного аргумента совпадают. Этот принцип работает всегда. Затем все переданные контекстом переменные подставляются в их плейсхолеры в шаблоне.</p>
21
<p>Если вам нужно вывести данные на странице, то добавляйте новые аргументы и обращайтесь к ним в шаблоне через переменные.</p>
21
<p>Если вам нужно вывести данные на странице, то добавляйте новые аргументы и обращайтесь к ним в шаблоне через переменные.</p>
22
<p>Шаблонизатор Jinja2 отличается от обычного HTML тем, что содержит в себе дополнительные конструкции:</p>
22
<p>Шаблонизатор Jinja2 отличается от обычного HTML тем, что содержит в себе дополнительные конструкции:</p>
23
<ul><li>{{ ... }} - для вывода переменных</li>
23
<ul><li>{{ ... }} - для вывода переменных</li>
24
<li>{% ... %} - для управления логикой шаблона</li>
24
<li>{% ... %} - для управления логикой шаблона</li>
25
<li>{# ... #} - для комментариев</li>
25
<li>{# ... #} - для комментариев</li>
26
</ul><p><a>Язык шаблонов</a>Jinja отчасти похож на синтаксис языков программирования. В нем также можно использовать условия, циклы, преобразовывать данные.</p>
26
</ul><p><a>Язык шаблонов</a>Jinja отчасти похож на синтаксис языков программирования. В нем также можно использовать условия, циклы, преобразовывать данные.</p>
27
<h2>Ипользование шаблонов</h2>
27
<h2>Ипользование шаблонов</h2>
28
<p>Теперь, когда мы добавили поддержку шаблонов во фреймворк, появляется способ создавать нетривиальные сайты. Ниже пример обработчика и шаблона для вывода курсов.</p>
28
<p>Теперь, когда мы добавили поддержку шаблонов во фреймворк, появляется способ создавать нетривиальные сайты. Ниже пример обработчика и шаблона для вывода курсов.</p>
29
<p><strong>Обработчик:</strong></p>
29
<p><strong>Обработчик:</strong></p>
30
<p><strong>Шаблон:</strong></p>
30
<p><strong>Шаблон:</strong></p>
31
<p>При открытии страницы<em>/courses/</em>у нас будет отображаться следующий список:</p>
31
<p>При открытии страницы<em>/courses/</em>у нас будет отображаться следующий список:</p>
32
<p>Блок {% for course in courses %} ... {% endfor %} отвечает за цикл, который выводит HTML-код, расположенный внутри него. Так мы выводим список всех записей, который передали в шаблон из представления как переменную courses.</p>
32
<p>Блок {% for course in courses %} ... {% endfor %} отвечает за цикл, который выводит HTML-код, расположенный внутри него. Так мы выводим список всех записей, который передали в шаблон из представления как переменную courses.</p>
33
<p>Использовать HTML напрямую в виде строки можно, но это небезопасно, неудобно, проблематично и сложно. Поэтому стоит использовать шаблонизаторы. Они позволяют описывать шаблон отдельно от остальной части кода, что упрощает работу с HTML-страницами.</p>
33
<p>Использовать HTML напрямую в виде строки можно, но это небезопасно, неудобно, проблематично и сложно. Поэтому стоит использовать шаблонизаторы. Они позволяют описывать шаблон отдельно от остальной части кода, что упрощает работу с HTML-страницами.</p>