Flask入门模板过滤器与测试器(5)
程序员文章站
2024-02-01 13:35:16
1 模板引擎之过滤器 概念 : 过滤器本质上是个转换函数,第一个参数是待过滤的变量。如果它有第二个参数,模板中就必须传进去。 过滤器使用管道符| 放在{{ }} Jinja2模板引擎提供了丰富的内置过滤器,主要分为以下几类: (1) 字符串进行操作: (2) 对列表进行操作 (3) 对数值进行操作: ......
1 模板引擎之过滤器
概念 : 过滤器本质上是个转换函数,第一个参数是待过滤的变量。如果它有第二个参数,模板中就必须传进去。
过滤器使用管道符| 放在{{ }}
Jinja2模板引擎提供了丰富的内置过滤器,主要分为以下几类:
(1) 字符串进行操作:
{# 当变量未定义时,显示默认字符串 #} <p>{{ name | default('None', true) }}</p> {# 单词首字母大写 Yes#} <p>{{ 'yes' | capitalize }}</p> {# 单词全小写 xml#} <p>{{ 'XML' | lower }}</p> {# 去除字符串前后的空白字符 like#} <p>{{ ' like ' | trim }}</p> {# 字符串反转,返回"olleh" #} <p>{{ 'hello' | reverse }}</p> {# format格式化 #} {{ '我叫%s 我今年%d岁了 我的存款为%.2f'|format('小胖子',38,1.00002) }} {# var|replace 替换 #} {{ data.html|replace('h','x') }} {# 关闭HTML自动转义 #} <p>{{ '<em>name</em>' | safe }}</p> {% autoescape false %} {# HTML转义,即autoescape关了也转义,可以缩写为e #} <p>{{ '<em>name</em>' | escape }}</p> {% endautoescape %}
(2) 对列表进行操作
{# 取第一个元素12 #} <p>{{ [12,21,33,44] | first }}</p> {# 取最后一个元素44 #} <p>{{ [12,21,33,44] | last }}</p> {# 返回列表长度,可以写为count #} <p>{{ [1,2,3,4,5] | length }}</p> {# 列表求和 #} <p>{{ [12,21,33,44] | sum }}</p> {# 列表排序,默认为升序 #} <p>{{ [12,21,33,44] | sort }}</p> {# 合并为字符串,返回"1 | 2 | 3 | 4 | 5" #} <p>{{ [1,2,3,4,5] | join(' | ') }}</p> {# 列表中所有元素都全大写。这里可以用upper,lower #} <p>{{ ['good','nice','handsome'] | upper }}</p>
(3) 对数值进行操作: 取证
{# 四舍五入取整,返回3 #} <p>{{ 3.14169 | round }}</p> {# 向下截取到小数点后2位,返回3.14 #} <p>{{ 3.14169 | round(2, 'floor') }}</p> {# 绝对值,返回15 #} <p>{{ -15 | abs }}</p> {# var|list 将var值转换为列表 #}
(4) 类型转换
{# var|int 将var值转换为整形 #} {# var|string 将var值转换为字符串类型 #} {# var|float 将var值转换为浮点形 #} {# var|list 将var值转换为列表 #}
(5) 变量输出JSON格式字符串:一般结合javescript使用
<script type="text/javascript"> var arg = {{ args | tojson | safe }}; console.log(arg[1].name); </script>
(6) 自定义过滤器
如果需要自定义过滤器,可以在主应用下定义个函数,因为过滤器本质也是函数
#定义过滤器函数 def filter(name): return .... #导入过滤器函数 app.add_template_filter(filter, 'fli')
2 模板引擎之测试器
概念: 测试器is返回结果为布尔值,一般与if控制语句搭配使用
(1)常见的内置测试器
{# 检查变量是否被定义,也可以用undefined检查是否未被定义 #} {% if name is defined %} <p>Name is: {{ name }}</p> {% endif %} {# 检查是否所有字符都是大写 #} {% if name is upper %} <h2>"{{ name }}" are all upper case.</h2> {% endif %} {# 检查变量是否为空 #} {% if name is none %} <h2>Variable is none</h2> {% endif %} {# 检查变量是否为字符串,也可以用number检查是否为数值 #} {% if name is string %} <h2>{{ name }} is a string.</h2> {% endif %} {# 检查变量是否可被迭代循环,也可以用sequence检查是否是序列 #} {% if [1,2,3] is iterable %} <h2>Variable is iterable.</h2> {% endif %} {# 检查变量是否是字典 #} {% if {'name':'test'} is mapping %} <h2>Variable is dict.</h2> {% endif %}
(2) 自定义测试器
#定义想实现的功能 def func(str): return ... #导入该功能 app.add_template_test(func,'测试器名')
3 全局函数
(1) dict函数,用于生成字典
{% set user = dict('username'='张三','password'=20) %}
(2) joiner()函数:用于分割循环,第一次为空字符串,以后每次都是分割符
{% set star = joiner('*') %} {% for val in range(4) %} {{ star }} {{ val }} {% endfor %}
上一篇: ofo创始人戴威发表内部信:要活下去