HTMLをエスケープせずにJinja2テンプレートでHTMLをレンダリングしようとしています。デフォルトでは、Jinja2は、補間するすべての変数を自動的にエスケープするように構成されています。
この意味は
<h1>this is foo page</h1>
実際には次のようにレンダリングされます
<h1>this is foo page</h1>
そのため、意図しないページで誤ってHTMLを使用することはありません。これは、クロスサイトスクリプティング(XSS)攻撃から保護するために非常に重要です。
この自動エスケープをバイパスし、意図的にHTMLをテンプレートに挿入する場合は、実行していることを確認する必要があります。エスケープされていないユーザー入力がこれらの変数に入らないようにしてください。
バックグラウンドレッスンとセキュリティ警告が邪魔にならないようにして、何をしているのかがわかっている場合は、テンプレートで値を「安全」として明示的にマークして、エスケープされないようにすることができます。次のように、Jinja2の組み込みフィルターを安全に使用するだけです。
<body>
{{ content | safe }}
</body>
あなたの場合、ブロックも必要だったと思うので、テンプレートの継承でオーバーライドできます。その例として、この完全なサンプルアプリで遊んでください
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>
templates / child.html:
{% extends "base.html" %}
{% block content %}
{{ super() }}
<h2>And this bit comes from the child template</h2>
{% endblock %}