出现的原因
视图函数会生成请求的响应,当视图函数接受包含用户输入数据的用户请求后,视图函数需要访问数据库,添加新用户,然后在生成相应,有两个过程,业务逻辑和表现逻辑,使得代码难以理解,维护
为了提高程序的可维护性
将表现逻辑写入模板中,及将响应写入模板中
什么是模板
模板是包含响应文本的文件,其中占位变量表示动态部分,具体值根据上下文信息获得
渲染
用真实值代替占位变量,返回最终响应字符串,这一个过程是
flask用jinja2模板进行渲染模板
jinja2模板引擎
- {% … %} 语句(Statements)
- {{ … }} 打印模板输出的表达式(Expressions)
- {# … #} 注释
- # … ## 行语句(Line Statements)
单行注释:
{#% for user in users %#}
下面是多行注释:
{# note: commented-out template because we no longer use this
{% for user in users %}
...
{% endfor %}
#}
静态表示
<h1>hello,world!</h1>
响应中含有使用变量表示的动态部分
<h1>hello,{{name}}</h1>
模板的渲染
flask在程序文件夹中的子文件夹templates中寻找模板
template中保存定义的模板,响应的模板
视图函数修改为
return render_template
(模板文件,占位变量=值)
return render_template(user.html,name = name )
左边的name表示模板中大的占位符,右边的name表示当前作用域中的变量,表示参数的值
render_template()函数将
jinja2模板引擎集成到程序中
变量
{{name}}这个位置的值告诉模板引擎从渲染模板时使用的数据中获取
变量的类型
列表、字典、对象
过滤器
hello,{{name|capitaliza}}
safe–>渲染时不转义
capitalize–>值得首字母转换成大写,其他字母为小写
lower–>小写
upper–>大写
title–>单词首字母大写
trim–>单词首尾字母转换
striptages–>html标签都去掉
控制结构
if else
{% if user %}
hello,{{user}}
{% else %}
hello,stranger!
{% endif %}
for
<ul>
{% for comment in comments %}
<li>{{comment}}</li>
{% endfor %}
</ul>
宏
{% macro render_comment(comment)%}
<li>{{comment}}</li>
{% endmacro %}
<ul>
{% for comment in comments %}
<li>{{render_comment(commnet)}}</li>
{% endfor %}
</ul>
为了重复使用宏定义,将定义的宏单独写在一个文件中,在需要的模板中导入
{% import 'macros.html' as macros %}
<ul>
{% for comment in comments %}
{{macors.render_comment(comment)}}
{% endfor %}
</ul>
重复使用的模板片段写在单独文件,包含在所有模板中,避免重复
{% include ‘common.html’ %}
模板继承
- 创建基模板base.html
<!DOCTYPE html>
<html>
<head>
{% block head %}-->block标签内定义的元素可在衍生模板中修改
<title>{ %block title %}{% endblock %} - My Application</title>
{%endblock%}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
衍生模板
{% extends "base.html "%}{extends声明这个模板衍生自base.html
在extend指令之后基模板的三个块被重新定义}
{% block title %}
Index
{%endblock%}
{% block head %}
{{super()}}**-->使用super获取原来的内容
<style>
</style>
{%endblock%}
{% block body%}
<h1>hello world!</h1>
{%endblock%}