Skip to main content
 首页 » 编程设计

python之为什么在 jinja 中使用 "safe"过滤器会创建嵌套元素

2025年05月04日9lonelyxmas

我有一个名为“旁白”的 Python 字典。这个字典的值是从我的数据库加载的 html 片段,我想将它们注入(inject)到 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。假设我的字典有 id 1 和 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 是如何不正确的。结束 p 标签缺少“>”。

然后在模板中

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

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

我认为这个问题仍然悬而未决,因为知道为什么会这样会很有趣。

请您参考如下方法:

您的模板有错误

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

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

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

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

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