Краткий справочник

Шпаргалка по шаблонизатору Mako

Краткий справочник по Mako: синтаксис шаблонов Python, выражения, управляющие конструкции, блоки кода Python, макросы def и наследование шаблонов.

· Опубликовано

Mako — это высокопроизводительный шаблонизатор для Python, сочетающий высокую скорость работы со знакомым синтаксисом Python и механизмом наследования шаблонов.

Базовый синтаксис и выражения

Variable x: ${x}
Expression arithmetic: ${x + 1}
HTML-escaped filter: ${x | h}
URL-encoded filter: ${x | u}
Trimmed whitespace: ${x | trim}

Управляющие конструкции

Управляющие конструкции начинаются с символа % и завершаются % endif, % endfor и т. д.:

% for user in users:
  % if user.is_active:
    <li>${user.name} (Active)</li>
  % else:
    <li>${user.name} (Inactive)</li>
  % endif
% endfor

Встроенный код Python

Блоки Python во время рендеринга

<%
    greeting = "Hello, " + user.name.upper()
    total_score = sum(user.scores)
%>
<p>${greeting}: ${total_score}</p>

Блоки Python уровня модуля

Тег <%! ... %> выполняется один раз на уровне модуля при компиляции шаблона:

<%!
    import datetime

    def format_date(dt):
        return dt.strftime("%Y-%m-%d")
%>
<p>Today: ${format_date(datetime.date.today())}</p>

Определения def (макросы) и сырые блоки

<%def name="render_card(title, body)">
  <div class="card">
    <h3>${title}</h3>
    <p>${body}</p>
  </div>
</%def>

${render_card("Feature", "Card body text")}

<%text filter="h">
  This is a raw block where ${expressions are not evaluated}.
</%text>

<%doc>
  Multi-line template comment
</%doc>

Наследование шаблонов

Базовый шаблон (base.html)

<!doctype html>
<html>
  <head>
    <title><%block name="title">Default Title</%block></title>
  </head>
  <body>
    <header><h1><%block name="header" /></h1></header>
    <main>${self.body()}</main>
  </body>
</html>

Дочерний шаблон (child.html)

<%inherit file="base.html" />

<%block name="title">Page Title</%block>
<%block name="header">Welcome to my site</%block>

<p>Это основной контент, который подставляется в self.body().</p>

Использование Python API

from mako.template import Template

template = Template("Hello, ${name}!")
print(template.render(name="World"))

Ссылки

Связанные темы