【问题标题】:How to Correctly Escape Jinja Code on Template?如何在模板上正确转义 Jinja 代码?
【发布时间】:2020-05-04 09:45:59
【问题描述】:

如何在模板上渲染 jinja 代码?

例如,我有一个路由需要在给定的 HTML 模板上呈现 jinja 代码,如下所示:

from app import app
from flask import render_template
from jinja2 import Template

@app.route('/View/Package')
def getView():
    HtmlDesc="""
    <div class="codehilite"><pre><span></span><span class="p">{{</span><span class="n">cookiecutter</span><span class="o">.</span><span class="n">repo_name</span><span class="p">}}</span><span class="o">/</span><span class="p">{{</span><span class="n">cookiecutter</span><span class="o">.</span><span class="n">repo_name</span><span class="p">}}</span><span class="o">/</span><span class="p">{{</span><span class="n">cookiecutter</span><span class="o">.</span><span class="n">repo_name</span><span class="p">}}</span><span class="o">.</span><span class="n">py</span>
    </pre></div>
    """

    return render_template('package.html', html=Template(HtmlDesc).render())

在模板上,我尝试使用 {% raw %}..{% endraw %}{% filter escape %} .. {% endfilter %} 转义 jinja 代码,如文档中的 here 所示,但它仍然不起作用:

<h1>Project Description</h1>
    <div class="project-description">   
    {% raw %}{% filter escape %}{{html|safe}}{% endfilter %}{% endraw %}
    </div>
</div>

例外:

TemplateSyntaxError: 意外'

我知道错误在{{&lt;/span&gt;&lt;span...class="p"&gt;}},值为HtmlDesc,因此我正在寻找一种适当的方法来逃避这类神社字符,以便在模板上正确呈现这个神社代码。谢谢。

已添加

我想要实现的是我希望 HtmlDeschtmljinja 代码能够在 Web 浏览器上正确解释和呈现。在我的实际应用程序中,上面的文本不是上面示例 sn-p 中的固定值,它从包含在 python 包中的文本文件README 中读取值并转换为 HTML 代码。它上面的示例文本是从python包cookiecutter读取的。

【问题讨论】:

    标签: python jinja2


    【解决方案1】:

    添加一个 |安全地结束您想要显示的任何内容。它会渲染出来。也让它成为一个字符串。

    在模板内,您似乎缺少标记内 {{ }} 中的 |safe

    您还必须删除Template() 以确保整个字符串被转义

    【讨论】:

    • 在问题中,我确实在模板内的jinja 代码旁边创建了一个|safe,例如{{html|safe}}。但它仍然会引发异常,如图所示。谢谢
    • 我的意思是在span class ="p"之后的HtmlDesc变量中
    • 啊,我明白你的意思了,这样做似乎很难,因为HtmlDesc 中的文本不是问题中的固定值。在我的应用程序中,它接收从文本文件README 读取的值,其中包括 python 包并转换为这个 html。它上面的文本来自包cookiecutter。谢谢
    • 恐怕我不明白你想要达到什么目的。您想将 html desc 呈现为 html 代码还是纯文本
    • 尝试删除 Template() 调用
    猜你喜欢
    • 2022-11-18
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多