BlackA,Talk is cheap,Show me the code.
目前为止,我们的程序都是简单的在视图函数中返回一个字符串,并由浏览器显示出来,这对一些小型的程序还可以,但是对于现在动辄几千条HTML的大型网站来说,python的字符串拼接无疑显得有些力不从心,这时就需要我们使用模板技术来动态的生成HTML。
开始使用模板之前我们需要新建一个名为templates的模板文件夹( 如果使用的是PyCharm等集成开发环境,这个文件夹可能已经被创建 ),注意:这里模板文件夹的名字必须为templates,因为Flask框架会默认的去templates这个文件夹下去寻找文件。
之后我们在templates文件夹下新建一个名为index.html的HTML文件,这个HTML文件就是我们将要使用的模板,内容如下:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<title>HelloWorld</title>
</head>
<body>
<h1>这是一个模板文件!</h1>
</body>
</html>之后我们就可以在程序中使用这个模板文件:
# 使用render_template这个函数渲染模板
from flask import Flask,render_template
app = Flask(__name__)
@app.route("/")
def index():
# 把模板文件的位置传递给render_template这个函数
# 这是一个以templates文件夹开始的相对路径
return render_template("index.html")
if __name__ == "__main__":
app.run(debug = True)下面是程序的运行结果:
我们使用模板的主要原因是希望页面可以动态的生成,即网页的内容随着环境的不同而有所不同,而不仅仅是返回一个静态的HTML页面,像上面这个例子我们返回index.html完全可以用Apache这样的Web服务器来完成,使用Flask框架无疑有些 ”大材小用“ ,下面我们就通过一个例子来学习如何动态的生成HTML页面的内容:
我们先来改造模板文件:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<title>个人中心</title>
</head>
<body>
{# 使用两个大括号表示要传入的变量 #}
<p>姓名:{{ name }}</p>
<p>性别:{{ sex }}</p>
<p>年龄:{{ age }}</p>
</body>
</html>在Jinja2中,使用 ‘ {# ’ 开头并以 ‘ #} ‘ 结尾表示注释,由 ’ {{ ‘ 和 ’ }} ‘ 扩起的部分就是要传入的变量,变量会在渲染模板时被实际传入的值替换,这样就可以动态的生成网页:
from flask import Flask,render_template
app = Flask(__name__)
@app.route("/")
def index():
return render_template("index.html")
@app.route("/about-me/")
def about():
# 在调用render_template时将要替换的变量以关键字参数的形式传入
# 因为我们还没有学习数据库等部分,所以这里固定了参数值
return render_template("about-me.html",name = "BlackA",sex = "男",age = 18)
if __name__ == "__main__":
app.run(debug = True)
当我们需要传入的参数比较多时,也可以使用python的字典解包:
@app.route("/about-me/")
def about():
user = {"name" : "BlackA",
"sex" : "男",
"age" : 18}
return render_template("about-me.html",**user)
如果我们传递的参数是一个类对象或一个字典,可以在模板中访问类对象的属性或字典的值,可以使用点 ” . “ 或下标 ” [] “ 来访问对象的属性或字典的键:
<body>
{# 使用点号访问对象的属性 #}
<p>姓名:{{ user_class.name }}</p>
{# 使用下标访问对象的属性 #}
<p>性别:{{ user_class["sex"] }}</p>
<hr />
{# 使用点号访问字典的键 #}
<p>姓名:{{ user_dict.name }}</p>
{# 使用下标访问字典的键 #}
<p>性别:{{ user_dict["sex"] }}</p>
</body>
class user:
name = "BlackA"
sex = "男"
user_class = user()
user_dict = {"name" : "BlackA","sex" : "男"}
@app.route("/about-me/")
def about():
return render_template("about-me.html",user_class = user_class,
user_dict = user_dict)下面是运行结果:
经实际测试,列表和元祖也可以使用以上两种方法访问对应的元素。