是否有可能让Jinja2忽略模板中包含{}的部分(例如,内联javascript)

时间:2013-08-06 01:35:40

标签: python jinja2

我通过复制/粘贴他们在网站上提供的代码,在我的页面上添加了一个facebook按钮。

看起来像这样:

"http://www.facebook.com/dialog/feed?app_id={{fbapp_id}}&link={{link_url}}&message={{share_message|urlencode}}&display=popup&redirect_uri={{link_url}}  

正如您所看到的那样,{}找到了Jinja。但是,由于我希望上述任何代码都被任何内容替换,我可以在模板中添加一些内容,告诉Jinja忽略分隔符之间的所有内容吗?

Python处理程序:

class MainHandler(webapp2.RequestHandler):
    def get(self):
        template = JINJA_ENV.get_template('index.html')
        self.response.write(template.render(None))

2 个答案:

答案 0 :(得分:24)

您通常可以找到该信息in the documentation, under "Escaping"或类似信息。在这种情况下,您可以使用变量表达式输出分隔符:

{{ '{{' }}

或者您可以使用raw块来获取更长的代码段:

{% raw %}
    <ul>
    {% for item in seq %}
        <li>{{ item }}</li>
    {% endfor %}
    </ul>
{% endraw %}

答案 1 :(得分:0)

这个问题很老但我最近遇到了同样的问题。如果您设置Jinja2 Environment以使用undefined = jinja2.DebugUndefined,它将忽略缺少的参数并将它们保留为新的Jinja模板。对于多阶段解析很有用,你也可以运行日志记录以了解何时尚未定义变量:

import logging
from Jinja2 import DebugUndefined

logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
undefined_logging = jinja2.make_logging_undefined(logger=logger, base=DebugUndefined)
jinja_env = jinja2.Environment(loader=FileSystemLoader, undefined=undefined_logging)
print(jinja2.from_string("Hello {{ worldarg }}")

This will result in a logger message such as
[date time] WARNING [<module>:lineno] Template variable warning worldarg is undefined
Hello {{ worldarg }}

模板输入将为传递的参数渲染jinja,但未修改为未定义。注意:这不太可能解决由例程定义的缺失模板或宏,但应记录和更改标准{{x}}类型。 *记录也取决于其配置方式!

StrictUndefined还存在选项(导致异常和模板处理停止)或者传递的参数中未定义的结果将被删除,并且字段为空白,而不会将错误返回给调用函数。