我在一个应用程序中使用Flask,该应用程序从sqlite数据库中呈现一些数据。我的问题是当应用程序渲染一些内部有html的文本时,显示为文本而不是html。例如,数据库中的记录具有以下文本:
My tailor <strong>is</strong> rich
html页面按原样呈现:
<html>
<!-- snip .... -->
My tailor >strong<is>/strong< rich
<!-- snip .... -->
</html>
而且,我想要的是这个(“是”字必须更大胆):
<html>
<!-- snip .... -->
My tailor <strong>is</strong> rich
<!-- snip .... -->
</html>
有人知道我该怎么办?
答案 0 :(得分:31)
如果您知道内容安全,只需使用safe
过滤器:
{# In the Jinja template #}
{% for article in articles %}
<div class="article">{{article|safe}}</div>
{% endfor %}
答案 1 :(得分: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>