gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:08:26 25 4
gpt4 key购买 nike

我有一个名为“旁白”的 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 错误,也许它可以更好地处理它,或者创建一个错误

关于python - 为什么在 jinja 中使用 "safe"过滤器会创建嵌套元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20452742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com