HTML Diff
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>