我有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调用无关,则可以省略它,不用担心。