flask学习笔记03

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 %}

Title {​{ marco.input_marco('name') }} ```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值