模板好处:
*
视图函数只负责业务逻辑和数据处理
*
而模板则取到视图函数的数据结果进行展示
*
代码结构清晰,耦合度低
模板概念:
*
Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
*
模板语言:是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名。
渲染模板函数
*
Flask提供的 render_template 函数封装了该模板引擎
*
render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。
默认过滤器
默认HTML的字符串会按照原样显示,可以使用safe进行标识该字符串是安全的。如果是用safe标识该字符串是安全的话,那么就会按照HTML语言格式进行显示或者执行。
自定义过滤器
方式1:装饰器的形式
# 列表是可变数据类型
@app.template(‘lireverse’)
def to_lireverse(li):
# 将传入的列表生成一个新的列表
temp = list(li)
# 反转
temp.recerse()
return temp
方式2:直接添加过滤器
app.add_temp;ate_golter(do_lireverse, 'lireverse')
控制代码块if语句
Jinja2 语法中的if语句跟 Python 中的 if 语句相似,后面的布尔值或返回布尔值的表达式将决定代码中的哪个流程会被执行:
{%if user.is_logged_in() %}
Logout
{% else %}
Login
{% endif %}
过滤器可以被用在 if 语句中:
{% if comments | length > 0 %}
There are {{ comments | length }} comments
{% else %}
There are no comments
{% endif %}
循环
我们可以在 Jinja2 中使用循环来迭代任何列表或者生成器函数
{% for post in posts %}
{{ post.title }}
{{ post.text | safe }}
{% endfor %}
循环和if语句可以组合使用,以模拟 Python 循环中的 continue 功能,下面这个循环将只会渲染post.text不为None的那些post:
{% for post in posts if post.text %}
{{ post.title }}
{{ post.text | safe }}
{% endfor %}
在一个 for 循环块中你可以访问这些特殊的变量:
在循环内部,你可以使用一个叫做loop的特殊变量来获得关于for循环的一些信息
比如:要是我们想知道当前被迭代的元素序号,并模拟Python中的enumerate函数做的事情,则可以使用loop变量的index属性,例如:
{% for post in posts%}
{{loop.index}}, {{post.title}}
{% endfor %}
会输出这样的结果
1, Post title
2, Second Post
cycle函数会在每次循环的时候,返回其参数中的下一个元素,可以拿上面的例子来说明:
{% for post in posts%}
{{loop.cycle('odd','even')}} {{post.title}}
{% endfor %}
会输出这样的结果:
odd Post Title
even Second Post
模板代码复用
宏的概念:
把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串
为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用
需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复
使用
定义宏
{% macro input(name,value='',type='text') %}
{% endmacro %}
调用宏
{{ input('name' value='zs')}}
这会输出
把宏单独抽取出来,封装成html文件,其它模板中导入使用,文件名可以自定义macro.html
{% macro function(type='text', name='', value='') %}
{% endmacro %}
在其它模板文件中先导入,再调用
{% import 'macro.html' as func %}
{% func.function() %}