flank.render_template()是否创建了分配了None关键字的变量



我有4个文件:

flask_blog.py

from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
@app.route("/home")
def home_page():
return render_template("home.html")
@app.route("/about")
def about():
return render_template("about.html", title = "About")

layout.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% if title %}
<title>Flask Blog - {{ title }}</title>
{% else %}
<title>Flask Blog</title>
{% endif %}
</head>
<body>
{% block content %}{% endblock content %}
</body>
</html>

home.html

{% extends "layout.html" %}
{% block content %}{% endblock content %}

about.html

{% extends "layout.html" %}
{% block content %}{% endblock content %}

在我的about页面上,标题是";Flask博客-关于";,在我的主页上,标题是";Flask博客"。现在,这是由于layout.html文件中的if/else语句造成的。if/else语句为:

{% if title %}
<title>Flask Blog - {{ title }}</title>
{% else %}
<title>Flask Blog</title>
{% endif %}

现在,"title"变量的值必须是0或None,因为我们要转到主页的else语句。现在,我的问题是,我们事先没有为"title"变量赋值。更好的是,我们甚至还没有在flask_blog.py文件中创建"title"变量。我们怎么不会得到NameError?我们不应该得到NameError: name 'title' is not defined吗?


相关

flask中默认使用的模板语言是Jinja。Jinja不是Python,因此有时它的工作方式有点不同。

当未定义变量时,Jinja模板中的if语句的求值结果为False。因此,它不会抛出异常,而是直接进入下一个else块。

更具体地说,一个未定义的变量变为Undefined类型,它有自己的文档页面:https://jinja.palletsprojects.com/en/3.1.x/api/#undefined-类型

这在模板语言中很有用,因为它可以更容易地重用复杂的模板,而不必每次渲染时都指定每个参数。如果一个参数(以及相应的If块(与render_template调用无关,则可以省略它,不用担心。

最新更新