如何从烧瓶(而非模板)访问块?

时间:2013-01-29 15:25:56

标签: python flask jinja2

这是我的一般性问题:

base.html:

<html>
  <head>
    {% if title %}
    <title>{{title}}</title>
    {% else %}
    <title>test</title>
    {% endif %}
  </head>
  <body>
    {% block content %} {% endblock %}
  </body>
</html>

如何编写可以直接创建块的函数?也许是这样的:

@app.route("/foo")
def foo():
    content = "<h1>this is foo page</h1>"
    return render_html("base.html", content = content)

2 个答案:

答案 0 :(得分:2)

您正试图在Jinja2模板中不使用 HTML escaping呈现HTML。默认情况下,Jinja2配置为自动转义您插入的所有变量。

这意味着

<h1>this is foo page</h1>

实际上呈现为

&lt;h1&gt;this is foo page&lt;/h1&gt;

因此,您不会在您不想要的页面中意外使用HTML。 非常重要可以防止Cross Site Scripting (XSS)攻击。

如果您要绕过这种自动转义,并故意在您的模板中插入HTML,您必须确保知道自己在做什么 - 绝不允许未转义的用户输入进入这些变量。

通过背景课程和安全警告,如果您确实知道自己在做什么,可以在您的模板中明确地将值标记为“安全”,这样它们就不会被转义。只需使用Jinja2的内置过滤器safe,就像这样:

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

在你的情况下,我认为你也想要一个块,所以你可以用template inheritance覆盖。举个例子,玩这个完整的示例应用程序

test.py:

import flask

app = flask.Flask(__name__)

@app.route("/foo")
def foo():
    content = "<h1>this is foo content</h1>"
    return flask.render_template("base.html", content=content)

@app.route("/bar")
def bar():
    content = "<h1>this is bar content</h1>"
    return flask.render_template("child.html", content=content)

if __name__ == "__main__":
    app.run(debug=True)

模板/ base.html文件:

<html>
  <head>
    {% if title %}
    <title>{{title}}</title>
    {% else %}
    <title>test</title>
    {% endif %}
  </head>
  <body>
    {% block content %}{{ content | safe }}{% endblock %}
  </body>
</html>

模板/ child.html:

{% extends "base.html" %}
{% block content %}
  {{ super() }}
  <h2>And this bit comes from the child template</h2>
{% endblock %}

答案 1 :(得分:0)

观点:

@app.route("/foo")
def foo():
content = "<h1>this is foo page</h1>"
return render_template("base.html", content = content)

base.html文件:

<html>
<head>
{% if title %}
<title>{{title}}</title>
{% else %}
<title>test</title>
{% endif %}
</head>
<body>
{% block content %} 
{% if content %}
{{ content | safe }}
{% else %}
No content provided
{% endif %}
{% endblock %}
</body>
</html>