jinja2 macros vs jsp2.0标签

mko*_*yak 4 python java jsp jinja2

我是一个学习python/jinjajava程序员.

使用jinja2宏的最大优点是拥有一个调用者()的限制.例如,我可以在jsp2标签中执行以下操作:

标签def:

<% attribute name="title" fragment="true">
<div class='title'>${title}</div>
<div class='body'><jsp:doBody/></div>
Run Code Online (Sandbox Code Playgroud)

用法:

<myTag>
  <jsp:attribute name='title'>
    <c:if test='${blah}'>This is only here sometimes</c:if>
  </jsp:attribute>
  <jsp:body>
    <c:if test='${something}'>some dynamic content</c:if>
  </jsp:body>
</myTag>
Run Code Online (Sandbox Code Playgroud)

我想强调的是,正文内容和"标题"属性都具有动态内容.此外,这里没有将变量设置为动态内容并将其传入的黑客攻击.

现在让我们看一下做同样事情的jinja宏:

{% macro myTag(title='', caller) -%}
  <div class='title'>{{ title }}</div>
  <div class='body'>{{ caller() }}</div>
{%- endmacro %}
Run Code Online (Sandbox Code Playgroud)

可是等等!我不能轻易地将动态内容放入title属性!

{% call myTag(title='imagine putting some content here that involves 5 loops, 4 ifs and whatnot?') %}
   {% if something %}some dynamic content{% endif %}
{% endcall %}
Run Code Online (Sandbox Code Playgroud)

这是我新手的问题,还是这是jinja的缺点?

zzz*_*eek 5

所以实际上这是Mako Templates for Python的核心功能.它不是广泛使用的功能,但它对我很重要,因为它在你提到的自定义模板标签中非常关键,所以它在那里:

http://www.makotemplates.org/docs/defs.html#calling-a-def-with-embedded-content-and-or-other-defs

JSP是Mako从中汲取灵感的几个模板系统之一.


Den*_*ach 5

除了dave建议的hack之外,您还可以将本地宏结果传递给任何其他宏.当您事先不知道将在本地定义传递参数或者它将来自模板变量时,这尤其有用:

{% macro doTag(title, body) %}
<div class='title'>{{ title }}</div>
<div class='body'>{{ body }}</div>
{% endmacro %}


{% macro tagBody() %}
{% if something %}some dynamic content{% endif %}
{% endmacro %}

{{ doTag(title='some simple title', body=tagBody() }}

{% macro tagTitle() %}
content here that involves 5 loops, 4 ifs
{% endmacro %}

{{ doTag(title=doTitle(), body=tagBody() }}
Run Code Online (Sandbox Code Playgroud)


mko*_*yak 0

现在有一个更好的解决方案:

http://mankyd.github.com/jinjatag/