默认配置:
template_folder='templates' ----- 模板的默认目录
render_template() -------- (x)html自动转义
render_template_string() ---- 字符串自动转义
{% autoescape %} ------- 手动设置是否转义
全局函数和辅助对象 ------- 增强模板的功能
1.什么是转义
把有特殊意义的字符显示出来
html标签中的<>------<>
2.全局对象
config ----- Flask的配置信息
request ----- 请求对象
session ----- 会话对象
g --------- 请求相关的全局变量 (如:g.user)
url_for -------- URL解析函数(如:静态文件地址解析、链接跳转地址解析)
get_flashed_messages() ------------ 会话消息
3.模板中变量的使用
- {% ... %}用于语句 标签中可包含表达式
- {{ ... }}用于表达式可以打印到模板输出
- {# ... #}用于未包含在模板输出中的注释
- # ... ##用于行语句
app.py中
@app.route('/index')
def index():
age = 40
money = 34
return render_template('hello.html',age=age,money=money)
hello.html中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jianjia</title>
</head>
<body>
<p>我的年龄:{{ age }}</p>
<p>我的钱包:{{ money }}</p>
</body>
</html>
3.1模板标签内置判断条件
defined/undefined ----- 变量是否已经定义
none ----- 变量是否为None
number/string ----- 数字/字符串判断
even/odd ----- 奇偶判断
upper/lower --------- 大小写判断
3.2for循环体内的变量
变量 | 描述 |
loop.index | 当前循环迭代的次数(从1开始) |
loop.index0 | 当前循环迭代的次数(从0开始) |
loop.revindex | 到循环结束需要迭代的次数(从1开始) |
loop.revindex0 | 到循环结束需要迭代的次数(从0开始) |
在for循环中使用continue/break
在app.py中加入
app = Flask(__name__)
app.jinja_env.add_extension('jinja2.ext.loopcontrols')
for循环中奇偶行设置不同样式
<li class="{{ loop.cycle('odd','even') }}"></li>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jianjia</title>
</head>
<style>
.odd{
color: green;
}
.even{
color: red;
}
</style>
<body>
{% for k in user %}
{% if k%4==0 and k%100!=0 or k%400==0 %}
<li class="{{ loop.cycle('odd','even') }}">{{ k }}年是闰年</li>
{% else %}
<li class="{{ loop.cycle('odd','even') }}">{{ k }}年不是闰年</li>
</li>
{% endif %}
{% endfor %}
</ol>
</body>
</html>
3.3模板标签
设置变量,赋值操作,可以通过import导入
{% set key,value = (1,2) %}
使用with代码块,实现块级作用域
{% with %}
{% set value = 42 %}
{{value}} 只在代码块中有效
{% endwith %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jianjia</title>
</head>
<body>
<h3>赋值的使用</h3>
{% with %}
{% set temp = 43 %}
{{ temp }}
{% endwith %}
</body>
</html>
3.4模板语法的转义
- 方式一:视为字符串
- 方式二:使用raw标签
{% raw %}
......
{% endraw %}
4.过滤器
过滤器,修改变量(如:格式化显示)
用管道符号(|)分割{{ name|striptags }}
可以链式调用
可以用圆括号传递可选参数
4.1、过滤器的使用方式
方式一:用管道符号(|)
{{ value|safe }}
方式二:使用标签
{% filter upper %}
......
{% endfilter %}
4.2 内置过滤器
1.求绝对值:{{ value|abs }}
2.默认值显示: default(value,default_value="",boolean=False)
{{ value|default('默认值') }}
{{ value|d('默认值') }}
3.html转义:{{ value|escape }}或 {{ value | e}}
4.富文本内容转义显示:{{ value|safe }}
5.倒序显示:{{ value|reverse }}
4.3 自定义过滤器
方式一:使用装饰器注册
@app.template_filter('reverse')
def reverse_filter(s):
return s[::-1]
方式二:调用函数注册
def reverse_filters(s):
return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
@app.template_filter('phone_format')
def phone_format(phone_num):
"""电话号码过滤器"""
return phone_num[0:3]+ '****' + phone_num[7:]
<h3>自定义过滤器的使用</h3>
<p>{{ phone|phone_format }}</p>
5.模板全局函数
- range([start],stop[step])
- dict(**items)
- cycler(*items) ---- 可用于css类名的循环
- joiner(stp=',') ---- 可用于字符串的拼接
- url_for ----- URL解析函数(如:静态文件地址解析、链接跳转地址解析)
<h3>cycler函数的使用</h3>
{% set class_name = cycler('row1','row2') %}
{% for i in range(100) %}
<p class="{{ class_name.next() }}">{{ i }}</p>
{% endfor %}
<h3>url_for函数的使用</h3>
<!--req是函数名 -->
<a href="{{ url_for('req') }}">点我跳转</a>
6.模板中的宏
- 把常用功能抽取出来,实现可重用
- 简单理解:宏≈函数
- 宏可以写在单独的html文件中
<h3>模板中的宏</h3>
{% macro input(name,type='text',value='') %}
<div>
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
</div>
{% endmacro %}
{{ input(name='username',value='admin') }}
6.1 文件中宏的使用
1.将前面定义的宏保存为forms.html
2.导入:
{% import 'forms.html' as forms %}
{% from 'forms.html' import input %}
3.使用:<p>{{ forms.input('username') }} </p>
7.模板的继承
步骤一:将可变的部分圈出来(base.html)
{% block content %}
内容区域
{% endblock %}
步骤二:继承父模板
{% extands 'base.html' %}
8.消息闪现
第一步:在视图中产生一个消息(提示/警告/错误)
flash(msg_content,msg_type)
参数msg_content:消息内容
参数msg_type:消息类型
第二步:在模板中展示消息
get_flashed_messages(category_filter=["error"])
参数category_filter:对产生的消息按类别查询