这是我的一般性问题:
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)
答案 0 :(得分:2)
您正试图在Jinja2模板中不使用 HTML escaping呈现HTML。默认情况下,Jinja2配置为自动转义您插入的所有变量。
这意味着
<h1>this is foo page</h1>
实际上呈现为
<h1>this is foo page</h1>
因此,您不会在您不想要的页面中意外使用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>