flask框架笔记03
jinja2模板过滤器
我们可以通过html传参的方式来传递信息,
接下来我们学习一下jinja2过滤器,来完成更复杂的操作
我们用下面两个代码块来举例
@app.route('/input/')
def net():
stu1 = {'num1':1,'name':'张三','grade':[90,89,89]}
stu2 = {'num1': 2,'name': '李四','grade': [67, 45, 45]}
if request.args.get('num') == '1':
return render_template('lesson3.html',**stu1)
elif request.args.get('num') == '2':
return render_template('lesson3.html', **stu2)
<body>
<h1>{{ num1 }}</h1>
<h2>{{ name }}</h2>
<h3>{{ grade[0] }}</h3>
<h4>{{ grade[1] }}</h4>
<h5>{{ grade[2] }}</h5>
</body>
这个函数的功能是,在输入不同的学号时显示不同的学生信息,
我们来加工一下他
ads()取绝对值函数,写法如下
<h1>{{ num1|abs }}</h1>
stu1 = {'num1':-6,'name':'张三','grade':[90,89,89]}
default()未输入值时显示默认值,写法如下,学生没有成绩就是缺考了,默认成绩是0.
stu1 = {'num1':-6,'name':'张三','grade':[90,89]}
<h5>{{ grade[2]|default(0) }}</h5>
first()第一个元素,last()最后一个元素
stu1 = {'num1':-6,'name':'张三','grade':[90,89]}
<body>
<h1>{{ num1|abs }}</h1>
<h2>{{ name }}</h2>
<h3>{{ grade|first }}</h3>
<h4>{{ grade|last }}</h4>
<h5>{{ grade[2]|default(0) }}</h5>
</body>
replace(old,new) 新的str替换旧的,
<h2>{{ name|replace("三","四") }}</h2>
在传参数时是否可以将html语句传进去执行哪?
<script>alert('欢迎来到学生信息管理系统');</script>
这条语句的功能是是一个弹窗
把这条语句移到代码中
stu1 = {'num1':-6,'name':'张三','grade':[90,89],'te':"<script>alert('欢迎来到学生信息管理系统');</script>"}
这样可以吗?肯定是不行的,他只是会把代码显示出来罢了
要想做到有两种办法
{% autoescape off %}
<p>{{ te }}</p>
{% endautoescape %}
<p>{{ te|safe }}</p>
还有一些见名知意的过滤器
int() float() lower() upper()
就不一一列举了
自定义过滤器
实际上,我们可用template_filter来自定义过滤器
@app.template_filter()
def fir_filter(value):
return value.replace('三','四')
然后直接在html里用就可以了
<p>{{ name|fir_filter() }}</p>
html控制语句
html中的控制语句是写在{% %}里的,可以使用if else语句和for else语句以及for循环中的特殊索引的语句
<body>
{% if num1>0 %}
<h1>{{ num1 }}</h1>
{% else %}
<h1>{{ num1|abs }}</h1>
{% endif %}
<h2>{{ name|replace("三","四") }}</h2>
{% for i in grade %}
<p>{{ i }}</p>
{% endfor %}
</body>
和python中略有不同,if和for必须有endif和endfor,
并且不同于py中的for是完整执行完执行else,html中是如果序列中没有值会进入else中
{% for i in grade %}
<p>{{ i }}</p>
{% else %}
<p>{{ 'test' }}</p>
{% endfor %}
把grade变成空list
结果自然是‘test’
还有就是for循环里的特殊过滤器
过滤器 | 描述 |
---|---|
loop.index | 当前迭代的索引(从1开始) |
loop.index0 | 当前迭代的索引(从0开始) |
loop.first | 是否是第一次迭代,返回True或False |
loop.last | 是否是最后一次迭代,返回True或False |
loop.length | 序列的长度 |
还有要注意,这个for用不了break和continue
宏
html中的宏和函数类似
它可以传参但是不能有return
<body>
{% macro input_marco(name,value='',type='text') %}
<input type="{{ type }}" name="{{ name }} value="{{ value }}"">
{% endmacro %}
<table>
<tr>
<td>用户名</td>
<td>{{ input_marco('name')}}</td>
<td>密码</td>
<td>{{ input_marco('passw',type='password')}</td>
</tr>
</table>
</body>
上面marco是宏的定义,
和函数一样宏除了本函数外,其他的函数也何以调用
新建一个html保存上面语句 input_marco.html
然后在要导入的html中写入以下语句就可以了
{% import 'input_marco.html' as marco %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<td>{{ marco.input_marco('name') }}</td>
</body>
</html>
{% import ‘input_marco.html’ as marco %}