Напомню, что у меня нет особого опыта веб-разработки на Python. Но поскольку рабочая теория на данный момент заключается в том, что это самый правильный скриптовый язык , мне бывает очень интересно сесть и поиграться с каким-нибудь Flask . Или, вот как в этот раз — с Jinja. В результате я написал небольшую шпаргалку по основам использования Jinja, чисто для себя. Уверен, вы уже давно владеете этим шаблонизатором в совершенстве, так что вам будет совершенно не интересно 🙂
Итак, коль скоро речь зашла о HTML, CSS и вот этом всем, не лишним будет упомянуть, как во Flask делается раздача статики:
def get_static ( path ) :
return send_from_directory ( ‘static’ , path )
Рендеринг же простейшего шаблона выглядит следующим образом:
def error_404 ( e ) :
data = flask. render_template ( ‘error.html’ , message = ‘Not found!’ )
return ( data , 404 )
… где содержимое templates/error.html:
< h1 > Что-то пошло не так! < / h1 >
< p > {{ message }} < / p >
<!— Пропущено —>
Поскольку у сайтов обычно есть повторяющиеся хидеры и футеры, традиционно шаблон выглядит как-то так:
{% block title %}Ошибка!{% endblock %}
{% block body %}
< h1 > Что-то пошло не так! < / h1 >
< p > {{ message }} < / p >
{% endblock %}
… где layout.html описывает шаблон страницы, в стиле:
< html lang = «en» >
< head >
< meta charset = «utf-8» >
< title > {% block title %}{% endblock %} < / title >
< / head >
< body >
{% block body %}{% endblock %}
< / body >
< / html >
Иногда возникает необходимость использовать в шаблонах условные операторы:
еще ключевые слова: elif, else
кстати, да, это — комментарий
#}
<li { % if section == «themes» % } class = «active» { % endif % } >
< a href = «themes» > Home < / a >
< / li >
<li { % if section == «submit» % } class = «active» { % endif % } >
< a href = «submit» > Submit < / a >
< / li >
Более сложный пример, с определением макроса и циклом for:
{% if themes_list == [] %}
< p >< em > (None) < / em >< / p >
{% else %}
{% for theme in themes_list %}
< div class = «theme» >
< p > {{ theme[«description»] }} < / p >
< / div >
{% endfor %}
{% endif %}
{% endmacro %}
Макрос вызывается очень просто:
Если вы уверены, что выводимые данные правильно экранированы и все такое, и хотите отключить замену спецсимволов на HTML-тэги (например, замену <
и >
на <
и >
), то можете сказать:
Чтобы Jinja могла вызвать процедуру, написанную на Python, используйте код в стиле:
# тут ваш код
app. jinja_env . globals . update ( encode_desc = encode_desc )
Как видите, все просто и понятно. Насколько я могу судить, приведенных в этом посте знаний должно хватить на все случаи жизни. Полную версию кода к посту вы найдете в этом репозитории на GitHub . Больше информации по Jinja — на официальном сайте .
Обратите также внимание на утилиту jinja2-cli , которую можно использовать, например, для генерации кода на каком-нибудь C. Еще из подобных проектов стоит обратить внимание на Cog .