在Flask中,配套的模板是Jinja2,这个模板非常的强大,并且执行效率高。
Flask渲染Jinja2模板,通过render_template方法来渲染一个模板
示例代码:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/index')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
运行结果:
注意:上面代码写法存在问题,url不能写成/index
示例代码:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
运行结果:
当访问/的时候,index()函数会在当前目录下的templates文件夹下寻找index.html模板文件。如果想更改模板文件地址,应该在创建app的时候,给Flask传递一个关键字参数template_folder,指定具体的路径,如下面代码所示:
from flask import Flask, render_template
app = Flask(__name__, template_folder='C:\data\templates')
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
上面代码中将会把模板文件的路径修改为了C盘中的data/template中。
如果程序中将要把参数传递给模板文件中时,参数传递方式如下代码所示:
main.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
content = {
"name": 'dgw',
"age": 25,
"sex": '男'
}
return render_template('index.html', **content)
if __name__ == '__main__':
app.run()
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
欢迎来到首页!
<div>
name:{{ name }} <br>
sex:{{ sex }} <br>
age:{{ age }} <br>
</div>
</body>
</html>
运行结果:
render_template需要传递的是一个关键字参数,当参数过多时可以使用字典进行包装,并且加两个*号,来转换成关键字参数。
关于Jinja2中更多参数的传递方式,如下示例代码所示:
main.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
content = {
"names": {"name": 'dgw'},
"age": 25,
"sex": '男'
}
name_list = ['张三', '李四', '王五']
return render_template('index.html', **content, name_list=name_list)
if __name__ == '__main__':
app.run()
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
欢迎来到首页!
<div>
names:{{ names.name }} <br>
names:{{ names['name'] }} <br>
sex:{{ sex }} <br>
age:{{ age }} <br>
{# personal info #}
</div>
<div>
<ul>
{% for name in name_list %}
<li>{{ name }}</li>
{% endfor %}
</ul>
</div>
</body>
</html>
运行结果:
- {{ ... }}:用来装载一个变量,模板渲染的时候,会把这个变量代表的值替换掉。并且可以间接访问一个变量的属性或者一个字典的key。关于点.号访问和[]中括号访问,没有任何区别,都可以访问属性和字典的值。
- {% ... %}:用来装载一个控制语句,以上装载的是for循环,只要涉及到控制语句的,就用{% ... %}。
- {# ... #}:用来装载一个注释,模板渲染的时候会忽视这中间的值。
Jinja2模板属性访问规则:
关于模板中这种使用:foo.bar,那么在Jinja2中是这样进行访问的:
- 先去查找foo的bar这个属性,也即通过getattr(foo,'bar')。
- 如果没有,就去通过foo.__getitem__('bar')的方式进行查找。
- 如果以上两种方式都没有找到,返回一个undefined。
关于模板中这种使用:foo['bar'],那么在Jinja2中是这样进行访问:
- 通过foo.__getitem__('bar')的方式进行查找。
- 如果没有,就通过getattr(foo,'bar')的方式进行查找。
- 如果以上没有找到,则返回一个undefined。