flask(十三)----模版渲染之管道命令+过滤器+测试器+环境处理器

目录

一。过滤器

内置过滤器

自定义过滤器

1.使用装饰器注册过滤器:@app.template_filter()

2.使用集中注册过滤器: app.add_template_filter()

 二。测试

 内置测试器

自定义测试器:@app.template_test()

三。@context_processor 环境处理器


一。过滤器

内置过滤器

1.字符串

1.1 当变量未定义时,显示默认字符串,可以缩写为d

<p>{{ name | default('No name', true) }}</p>

1.2 单次首字母大写

<p>{{ 'hello' | capitalize }}</p>

1.3 单词全小写

<p>{{ 'CHUNTIAN' | lower }}</p>

1.4 去除字符串前后的空白符

<p>{{ ' hello ' | strim }}</p>

1.5 字符串反转,返回olleh

<p>{{ 'hello' | reverse }}</p>

1.6 格式化输出,返回‘ chuntian is 4 years old '

<p>{{ '%s is %d years old | format('chuntian', 4) }}</p>

2.数字

2.1 四舍五入取整

<p>{{ 3.1514926 | round }}</p> 返回3

2.2 向下截取小数点后2位

<p>{{ 3.1514926 | round(2, 'floor') }}</p> 返回3.15

2.3 取绝对值

<p>{{ -4 | abs }}</p> 返回4

3.列表

3.1 取第一个元素

<p>{{ [1,2,3,4,5] | first }}</p> 返回1

3.2 取最后一个元素

<p>{{ [1,2,3,4,5] | last }}</p> 返回5

3.3 返回列表长度

<p>{{ [1,2,3,4,5] | length }}</p> 返回5

3.4 列表求和

<p>{{ [1,2,3,4,5] | sum }}</p> 返回15

3.5 列表排序,默认为升序

<p>{{ [3,2,1,4,5] | sort }}</p> 返回[1,2,3,4,5]

3.6 合并为字符串,返回“ 1|2|3|4 |5 ”

<p>{{ [1,2,3,4,5] | join(" | ") }}</p> 返回1

3.7 列表所有元素都大写/小写

<p>{{ [“USer”,"name","agE"] | upper }}</p>

4. tojson:将字典转换为json字符

<p>{{ {"name":"chuntian"} | tojson | safe() }}</p> 

自定义过滤器

1.使用装饰器注册过滤器:@app.template_filter()

2.使用集中注册过滤器: app.add_template_filter()

后端代码

import time
from datetime import datetime

from flask import Flask, render_template

app = Flask(__name__)

@app.template_filter('format_time')     # 模板渲染中格式话时间戳
def format_str_time(timestamp):
    return datetime.fromtimestamp(timestamp)

# 不使用装饰器注册,使用集中注册的方式:
# app.add_template_filter(format_str_time,'format_time')  

@app.route('/')
def index():
    projects = [
        {"name": "项目1", "interface_num": 11, "time": int(time.time())},
        {"name": "项目2", "interface_num": 22, "time": int(time.time())},
        {"name": "项目3", "interface_num": 33, "time": int(time.time())},
        {"name": "项目4", "interface_num": 44, "time": int(time.time())},
    ]
    # render_template()中第1个参数后面的参数,会将数据传给第1个参数页面,页面中若存在{{ }},则会匹配后面参数的数据。
    return render_template('index.html', pro=projects, title='测试平台')


if __name__ == '__main__':
    app.run(debug=True)

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    {% for project in pro %}
        {% set name=project.name %} <!--# 设置变量-->
        {% if not loop.last %}
            <div>序号:{{ loop.nextitem.name }}--项目名称:{{ name }},接口数量:{{ project["interface_num"] }},创建日期:{{ project["time"] | format_time }}</div>
        {% else %}
            <div>序号:{{ loop.index }}--项目名称:{{ name }},接口数量:{{ project["interface_num"] }},创建日期:{{ project["time"] }}</div>
        {% endif %}
    {% endfor %}
</body>
</html>

效果

 二。测试

if xxxx is xxxx ,根据判断结果来执行后面的逻辑,如:

{% if loop.index is divisibleby(2) %}        如果循环序号能整除2 ,则xxxx

 内置测试器

        1.1 检查变量是否被定义,也可用undefined检查是否未被定义

                {% if name is defined %}

                        <p> Name is : {{ name }}</p>

                {% endif % }

        1.2 检查是否所有字符都是大写

                {% if name is upper %}

                        <p> Name is : {{ name }}</p>

                {% endif % }

        1.3 检查变量是否为空

                {% if name is none %}

                        <p> Name is : {{ name }}</p>

                {% endif % }

        1.4 检查变量是否是字符串,也可以用number检查是否是数值

                {% if name is string %}

                        <p> Name is : {{ name }}</p>

                {% endif % }

        1.5 检查数值是否是偶数,也可以用odd检查是否是奇数

                {% if name is even %}

                        <p> Name is : {{ name }}</p>

                {% endif % }

        1.6 检查变量是否可以被迭代循环,也可以用sequence检查是否是序列

                {% if name is iterable %}

                        <p> Name is : {{ name }}</p>

                {% endif % }

        1.7 检查变量是否是字典

                {% if name is mapping %}

                        <p> Name is : {{ name }}</p>

                {% endif % }

自定义测试器:@app.template_test()

import json
import time

from flask import Flask, render_template

app = Flask(__name__)

@app.template_test()
def jsoned(test_data):
    # 测试器判断是否为json格式数据,测试器条件成立与否都要返回布尔值True/False
    try:
        json.loads(test_data)
        return True
    except ValueError:
        return False

@app.route('/')
def index():
    projects = [
        {"name": "项目1", "interface_num": 11, "time": int(time.time())},
        {"name": "项目2", "interface_num": 22, "time": int(time.time())},
        {"name": "项目3", "interface_num": 33, "time": int(time.time())},
        {"name": "项目4", "interface_num": 44, "time": int(time.time())},
    ]
    # render_template()中第1个参数后面的参数,会将数据传给第1个参数页面,页面中若存在{{ }},则会匹配后面参数的数据。
    return render_template('index.html', pro=projects, title='测试平台', test_json='{"name":"chuntian"}')

if __name__ == '__main__':
    app.run(debug=True)

 效果:

三。@context_processor 环境处理器

        环境处理器不仅可以传递变量,还可以传递函数。被修饰的函数必须返回一个字典。

        函数用@app.context_processor装饰器装饰,它是一个上下文处理器,它的作用是在模版渲染前运行其所修饰的函数,并将函数返回的字典导入到模版上下文环境中,与模版上下文合并。    

效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chuntian_tester

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值