为什么在jinja中使用“安全”过滤器会创建嵌套元素

时间:2013-12-08 11:12:23

标签: python flask jinja2

我有一个名为“asides”的python字典。这个dict的值是从我的数据库加载的html片段,我想将它们注入jinja模板。

以下是jinja片段:

<div class="small-3 large-3 columns">
        {% for k in asides.keys() %} 
            <div id={{k}} class="aside">{{asides[k]|safe}}</div>
        {% endfor %}
</div>

这会创建嵌套的div。假设我的dict有id和2,这将执行以下操作:

<div class="small-3 large-3 columns">
            <div id=1 class="aside">some html here
            <div id=2 class="aside">some html here
            </div>
            </div>
</div>
</div>

如果我删除了安全过滤器,它通常会创建非嵌套的div。

我想知道为什么安全过滤器会这样做以及如何避免它(因为我不想要嵌套的div)。


好的,按照评论中的建议,我意识到问题出在哪里。我将在这里记录,因为在我看来这是一件有趣的事情。

所以,在app.py中(使用Flask):

from flask import Flask, render_template

app = Flask(__name__)
app.debug = True

@app.route('/')
def index():
    d = {'1':'<p>Test 1</p', '2':'<p>Test 2</p>'}
    return render_template('index.html', d=d)

if __name__=='__main__':
    app.run()

注意d中第一个元素的html是如何不正确的。结束标签缺少“&gt;”。

然后在模板中

<html>
    <body>
        <div>
            {% for k in d %}
                <div class={{k}}>{{d[k]|safe}}</div>
            {% endfor %}    
        </div>
    </body>
</html>

这会将第二个div嵌套在第一个div中。

我认为问题仍然存在,因为知道为什么会发生这种情况会很有趣。

1 个答案:

答案 0 :(得分:0)

您的模板有错误

d = {'1':'<p>Test 1</p', '2':'<p>Test 2</p>'}

第一个para标签没有正确关闭,应该是

'1':'<p>Test 1</p>'

我遇到了同样的问题,输入数据中的HTML标记不完整。

我不确定这是否是Jinja错误,也许它可以更好地处理它,或者创建错误