0

これが私の一般的な質問です:

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)
4

2 に答える 2

2

HTMLをエスケープせずにJinja2テンプレートでHTMLをレンダリングしようとしています。デフォルトでは、Jinja2は、補間するすべての変数を自動的にエスケープするように構成されています。

この意味は

<h1>this is foo page</h1>

実際には次のようにレンダリングされます

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

そのため、意図しないページで誤って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 %}
于 2013-01-29T18:52:51.603 に答える
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>
于 2013-01-29T15:48:22.033 に答える