mko*_*yak 4 python java jsp jinja2
我是一个学习python/jinja的java程序员.
使用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的缺点?
所以实际上这是Mako Templates for Python的核心功能.它不是广泛使用的功能,但它对我很重要,因为它在你提到的自定义模板标签中非常关键,所以它在那里:
http://www.makotemplates.org/docs/defs.html#calling-a-def-with-embedded-content-and-or-other-defs
JSP是Mako从中汲取灵感的几个模板系统之一.
除了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)
归档时间: |
|
查看次数: |
1217 次 |
最近记录: |