flask的模板功能是基于jinja2模板引擎来实现的。模板文件存放在当前目前下的子目录templates(一定要使用这个名字)下。
main.py 代码如下:
from flask import flask, render_template
app = flask(__name__)
@app.route(‘/hello’)
@app.route(‘/hello/’)
def hello(name=none):
return render_template(‘hello.html’, name=name)
if __name__ == ‘__main__’:
app.run(debug=true)
hello.html代码如下:
hello sample
{% if name %}
hello {{ name }} !
{% else %}
hello world!
{% endif %}
模板的表达式都是包含在分隔符”{{ }}”内的;控制语句都是包含在分隔符”{% %}”内的;另外,模板也支持注释,都是包含在分隔符”{# #}”内,支持块注释。表达式
表达式一般有这么几种:
最常用的是变量,由flask渲染模板时传过来,比如上例中的”name”
也可以是任意一种python基础类型,比如字符串{{ “hello” }},用引号括起;或者数值,列表,元祖,字典,布尔值。直接显示基础类型没啥意义,一般配合其他表达式一起用
运算。包括算数运算,如{{ 2 + 3 }};比较运算,如{{ 2 > 1 }};逻辑运算,如{{ false and true }}
过滤器“|”和测试器“is”。这个在后面会介绍
函数调用,如{{ current_time() }};数组下标操作,如{{ arr[1] }}
“in”操作符,如{{ 1 in [1,2,3] }}
字符串连接符”~”,作用同python中的”+”一样,如{{ “hello ” ~ name ~ “!” }}
“if”关键字,如{{ ‘hi, %s’ % name if name }}。这里的”if”不是条件控制语句。
控制语句
jinja2的控制语句主要就是条件控制语句if,和循环控制语句for,语法类似于python。我们可以改动下上节的模板代码:
{% if name and name == ‘admin’ %}
this is admin console
{% elif name %}
welcome {{ name }}!
{% else %}
please login
{% endif %}
上面是一个条件控制语句的例子,注意if控制语句要用”{% endif %}”来结束。模板中无法像代码中一样靠缩进来判断代码块的结束。再来看个循环的例子,我们先改下python代码中的”hello”函数,让其传两个列表进模板。
def hello(name=none):
return render_template(‘hello.html’, name=name, digits=[1,2,3,4,5],
users=[{‘name’:’john’},
{‘name’:’tom’, ‘hidden’:true},
{‘name’:’lisa’}
{‘name’:’bob’}])
模板如下:
{% if name and name == ‘admin’ %}
helle admin
{% elif name %}
“hello” ~ {{ name }} ~ “!”
{% else %}
hello world!
{% endif %}
{% for digit in digits %}
{{ digit }}
{% endfor %}
同if语句一样,for控制语句要用”{% endfor %}”来结束。页面上,每个元素之间会有空格,如果你不希望有空格,就要在”for”语句的最后,和”endfor”语句的最前面各加上一个”-“号。如:
{% for digit in digits -%}
{{ digit }}
{%- endfor %}
你可以看到数字”12345″被一起显示出来了。我们再来看个复杂的循环例子:
{% for user in users if not user.hidden %}
{% if loop.first %}
user list:
{% endif %}