首页 > 解决方案 > python 3中的Jinja2 html表示

问题描述

我正在写一个烧瓶驱动的博客,我想以 XML 格式保存我的评论到浏览器,所以我打开了 XML 文件并从中读取。

from xml.etree.ElementTree import parse

def blue():
with open('blogcomment.xml') as file:
    doc = parse(file)

return '\n'.join("""
        <div class="card">
            <span></span>
            <div class="content">
                <p class="date">%s</p>
                <h3></h3>
                <p class="desc">%s</p>
            </div>
        </div>
        """%(item.findtext('date'), item.findtext('body')) for item in doc.iterfind('entries/entry'))

然后我打电话给蓝色

@sqldb.route('/dbresult')
def dbresult():
   f = blue()
   return f

#输出:

2007 年 11 月 14 日

在 qui latine elaboraret,ad nam phaedrum mediocrem cotidieque。

2007 年 11 月 18 日

我得到了我订购的新立方体。这是一颗真正的珍珠。

这是我想要的,但我希望它出现在我博客的特定部分,所以我创建了

<!doctype html>
<html>

<head>
</head>

<body>
{{f}}


</body>

</html>

并将我的路线更改为

@sqldb.route('/dbresult')
def dbresult():
   f = blue()
   return render_template('dbresult.html', f=f)

当我运行它输出的代码时

<div class="card"> <span></span> <div class="content"> <p class="date">11/14/2007</p> <h3></h3> <p 
class="desc">in qui latine elaboraret, ad nam phaedrum mediocrem cotidieque.</p> </div> </div> <div 
class="card"> <span></span> <div class="content"> <p class="date">11/18/2007</p> <h3></h3> <p 
class="desc">Got the new cube I ordered. It’s a real pearl.</p> </div> </div> 

在浏览器上,因为浏览器没有解释 HTML,是来自 Jinja2 还是我做错了什么,我需要帮助。

博客评论.xml

   <?xml version="1.0"?>
   <blog>
    <entries>
        <entry>
            <date>11/14/2007</date>
            <name>Jeff</name>
            <body>in qui latine elaboraret, ad nam phaedrum mediocrem cotidieque.</body>
        </entry>

        <entry>
            <date>11/18/2007</date>
            <name>Petter</name>
            <body>Got the new cube I ordered. It&#x2019;s a real pearl.</body>
        </entry>

    </entries>
</blog>

标签: htmlpython-3.xjinja2

解决方案


Flask 的默认配置包括.html模板的自动转义。因此,当您将变量{{ f }}放入模板时,该f变量将被视为不安全变量,并且任何“危险”字符(例如<>)都将被转义(转换为 HTML 实体)。

为了防止这种行为,您可以使用安全模板过滤器,它将变量标记为安全,因此它不会被转义:

<!doctype html>
<html>

<head>
</head>

<body>
{{ f | safe }}
</body>

</html>

确保其中f不包含任何恶意代码。

更好的方法是,在您的blue方法中,您只需准备要呈现的数据(例如,从数据中制作字典列表),然后使用内置的for控制语句在模板文件中呈现注释。


推荐阅读