19

我在一个应用程序中使用 Flask 来呈现来自 sqlite 数据库的一些数据。我的问题是当应用程序呈现一些内部包含 html 的文本时,显示为文本而不是 html。例如,数据库中的记录有以下文本:

My tailor <strong>is</strong> rich

html页面按原样呈现:

<html>
<!-- snip .... -->
My tailor &gt;strong&lt;is&gt;/strong&lt; rich
<!-- snip .... -->
</html>

而且,我想要的是这个(“是”字必须更大胆):

<html>
<!-- snip .... -->
My tailor <strong>is</strong> rich
<!-- snip .... -->
</html>

有人知道我该怎么做吗?

4

2 回答 2

46

如果您知道内容是安全的,只需使用safe过滤器:

{# In the Jinja template #}
{% for article in articles %}
<div class="article">{{article|safe}}</div>
{% endfor %}
于 2012-10-01T13:11:50.343 回答
0

另一种可能性是使用 jinja Markup 类,就像安全过滤器一样。这将允许您在不通过安全过滤器过滤内容的情况下呈现 HTML。下面是一个如何实现的示例。

from jinja2 import Markup, escape

def render_markup():
    return Markup("{0}{1}{2}{3}{4}".format(
        escape("My tailor "), 
        "<strong>", 
        escape("is"), 
        "</strong>", 
        escape(" rich")))

在此之后,您可以在 Flask jinja 全局变量中注册您的函数,并从 jinja 模板中使用它。

app.jinja_env.globals["render_markup"] = render_markup

模板中不需要保险箱。

<html>
<!-- snip .... -->
{{ render_markup() }}
<!-- snip .... -->
</html>
于 2015-04-25T20:15:32.890 回答