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

Flask入门模板过滤器与测试器(五)的更多相关文章

  1. flask模板的基本用法(定界符、模板语法、渲染模板),模板辅助工具(上下文、全局对象、过滤器、测试器、模板环境对象)

    flask模板 在动态web程序中,视图函数返回的HTML数据往往需要根据相应的变量(比如查询参数)动态生成. 当HTML代码保存到单独的文件中时,我们没法再使用字符串格式化或拼接字符串的当时在HTM ...

  2. Flask 页面缓存逻辑,jinja2 过滤器,测试器

    回调接入点-页面缓存逻辑 from flask import Flask,request,render_template from werkzeug.contrib.cache import Simp ...

  3. Flask入门模板Jinja2语法与函数(四)

    1 模板的创建 模板文件结构: project/ templates/ 模板文件 跳转模板一般使用: from flask import render_template,render_template ...

  4. Flask之模板过滤器

    3.2 过滤器: 过滤器的本质就是函数.有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化.运算等等,这就用到了过滤器. 过滤器的使用方式为:变量名 | 过滤器. 过滤器名写在 ...

  5. Flask入门系列(转载)

    一.入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等.用传统的Java写,太笨重了,连PHP都嫌麻烦.一直在寻找一个轻量级 ...

  6. Flask入门很轻松(三)—— 模板

    Jinja2模板引擎 转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10959471.html Flask内置的模板语言,它的设计思想来源于 Dja ...

  7. Flask07 Jinja2模板测试器、控制语句IF/FOR、变量/块 赋值、作用域、块级作用域

    1 测试器及其使用 在模板中的 {{}} 可以书写测试器,格式如下 {{ 变量 is 测试器名称  }} 1.1 在python中导入 Jinja2 的模板 from jinja2 import te ...

  8. SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂)

    SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂) 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏/高词汇.访问权限控制(URL级别 ...

  9. CPF 入门教程 - 设计器和模板库的使用(五)

    CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF ...

随机推荐

  1. Pollard_Rho 整数分解法【学习笔记】

    引文:如果要对比较大的整数分解,显然之前所学的筛选法和是试除法都将不再适用.所以我们需要学习速度更快的Pollard_Rho算法. 算法原理: 生成两个整数a和b,计算p=gcd(a-b, n),知道 ...

  2. Selenium => Debugging “Element is not clickable at point” error

    [From] http://stackoverflow.com/questions/11908249/debugging-element-is-not-clickable-at-point-error ...

  3. openssl-devel和openssl 是什么具体关系

    [转自] https://zhidao.baidu.com/question/919579491101051499.html Redhat在封装openssl的时候,把openssl分成了几个部分,执 ...

  4. 01背包----简单DP

    描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要ne ...

  5. ssh无密码登录和scp无密码拷贝

    目的:在A主机上无密码登录B主机 方法: A主机生成密钥:ssh-keygen -t rsa 将密钥复制到B主机:cat ~/.ssh/id_rsa.pub | ssh root@B 'cat > ...

  6. PIE SDK Command、Tool、Control的调用和拓展

    1.功能简介 在一个项目中,是通过小组成员共同开发的,难以避免的是当项目功能集成的时候会出现很多兼容性问题,开发讲究高内聚低耦合,利用Command.Tool和Control的使用,可以提升集成的效率 ...

  7. Xtts v4变化&先决条件&已知问题

    V4变化的主要有:     1.这个采购使用简化的命令.源的一个命令(--backup)和目标的一个命令(--restore). 2.此过程只需要在源和目标的$ TMPDIR(res.txt)之间复制 ...

  8. $bzoj1007-HAOI2008$ 水平可见直线 下凸包

    题面描述 在\(xOy\)直角坐标平面上有\(n\)条直线\(L_1,L_2,...,L_n\),若在\(y\)值为正无穷大处往下看,能见到\(L_i\)的某个子线段,则称\(L_i\)为可见的,否则 ...

  9. Spring Cloud Zuul实现动态路由

    1.添加依赖 2.启动类上添加注解 3.配置文件 zuul.ignored-services配置需要忽略的服务,多个用逗号分隔 注释zuul.ignored-services 前: 注释zuul.ig ...

  10. 阅读redis源代码的一些体会

    最近在学习redis及阅读redis等程序的源码时,有一些收获,特记录到下面. 1.第一步,阅读源代码借助最好可以跟踪的工具去读,如sourceinsight. 我使用的是windows7环境,又因为 ...