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

用户

我的问题是:

在基本.html公司名称:

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

如何编写一个可以直接创建块的函数?可能是这样的:

^{pr2}$


已被浏览了6788次
更新日期: 2020-09-28 07:34:30
2 个回答
fefe Tyson

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

这意味着

^{1}$

实际上呈现为

^{pr2}$

所以你不会无意中在页面中无意中使用HTML。这对于防止Cross Site Scripting (XSS)攻击非常重要。在

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

如果您知道自己在做什么,那么您可以在模板中显式地将值标记为“安全”,这样它们就不会被转义。只需使用Jinja2的内置过滤器safe,如下所示:

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

在您的例子中,我认为您还希望有一个块,因此可以用template inheritance重写。作为一个例子,使用这个完整的示例应用程序

在测试.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)

模板/基本.html公司名称:

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

模板/儿童.html公司名称:

{% extends "base.html" %}
{% block content %}
  {{ super() }}
  <h2>And this bit comes from the child template</h2>
{% endblock %}
评论 - 2020年8月7日 16:58
fefe Tyson

视图:

^{1}$

在基本.html公司名称:

^{pr2}$
评论 - 2020年8月7日 16:58

最新Python问答

推荐Python问答