避免来自Jinja2的含糊不清的胡须,包括jQuery模板

Bri*_*unt 28 jquery jinja2 jquery-templates

我正在尝试将jQuery模板插入到Jinja2模板中.唉,他们(在默认设置中)分别使用胡须{{}}表示表达式和文字.

我将我的jQuery模板插入带有script标签的HTML中,如下所示:

<script type='text/x-jquery-template'>
    <div>The people are:
         {{ each people }} 
          ${$value}
         {{ /each }}
    </div>
</script>
Run Code Online (Sandbox Code Playgroud)

然而,如果上面是Jinja模板,它就会因为Jinja试图将其解释each为文字而贬低.

在这种情况下(我们已经有很多模板),改变Jinja2的变量开始和结束分隔符是不切实际的.此外,它令人困惑,降低了互操作性,并需要额外的培训.最好避免使用此选项.

所以我想到的两个替代方案就是:

  1. Jinja2逃避每个'{{'和'}}',我不太确定如何做得最好("{{"{{"}}`,也许,但这很冗长);

  2. 更实际 - 也许是理想的 - 会告诉Jinja2 不要解析代码块,也许是通过jQuery扩展.

我很感激你的想法和反馈.谢谢你的阅读.

Cam*_*ron 54

您可以使用该{% raw %}{% endraw %}构造来缓解逃避的困境(直接来自Jinja2文档).

例:

<script type='text/x-jquery-template'>
    <div>The people are:
        {% raw %}<!-- Everything in here will be left untouched by Jinja2 -->

        {{ each people }} 
          ${$value}
        {{ /each }}

        {% endraw %}
    </div>
</script>
Run Code Online (Sandbox Code Playgroud)

  • 虽然转义和阻止转义很好,但我得出的结论是,最好的方法是确保服务器分隔符都是服务器独有的,而客户端分隔符都是客户端独有的,因此不需要转义.通过将服务器模板引擎配置为使用您自己的自定义分隔符,似乎可以做到这一点.这使得人们可以自由选择服务器和客户端模板,而不会出现问题.另外请注意,应该确保BOTH引擎不与JavaScript或其他客户端编码冲突. (4认同)