Flask 入门5 :过滤器

1. 自定义过滤器

过滤器本质上是 Python 的函数,他会把被过滤的值当作第一个参数传给这个函数,函数经过一些逻辑处理后,再返回新的值。在过滤器函数写好后,可以通过@app.template_filter 装饰器或者是app.add_template_filter函数来把函数注册成 Jinja2 能用的过滤器。这里我们以注册一个时间格式化的过滤器为例,来说明下自定义过滤器的方法:

def datetime_format(value, format="%Y-%m-%d %H:%M"):return value.strftime(format)
app.add_template_filter(datatime_format,"dformat")

上面我们定义了一个 datatime_format 的函数,第一个参数是需要被处理的值,第二个参数是时间的格式,并且指定了一个默认值。然后下面通过 app.add_template_filter,将datatime_format函数注册成了过滤器,并且这个过滤器的名字,叫做dformat。那么以后在模板文件中,就可以直接类似于这样使用了:

{{article.pub_data | dformat }}
{{article.pub_data | dformat("%B %Y") }}

如果 app.add_template_filter没有传第二个参数,那么默认使用函数的名称作为过滤器的名称。比如以上注册过滤器如果改成以下代码:

app.add_template_filter(datatime_format)

那么在模板中,就需要这样使用了:

{{article.pub_data | datatime_format }}

当然,我们也可以通过@app.template_filter装饰器,在函数定义的时候,就将它注册成过滤器。比如以上的 datetime_format函数,我们可以这样写:

@app.template_filter("dformat")
def datetime_format(value, format="%Y-%d-%m %H:%M"):return value.strftime(format)

现在 datetime_format@app.template_filter 装饰后,就会自动被注册进 Jinja2 的过滤器中。并且 @app.template_filter 中的参数即为自定义过滤器的名称,如果不传参数,也是会自动使用函数名称作为过滤器名称的。

2. Jinja2 内置过滤器

Jinja2 内置过滤器官方文档:
https://jinja.palletsprojects.com/en/3.0.x/templates/#builtin-filters

  1. abs(value):获取 value 的绝对值。
  2. default(value, default_value, boolean=False):如果 value 没有定义,则返回第二个参数 default_value 。如果想要让 value 在被判断为 False 的情况下使用 default_value,则应该将后面的 boolean 参数设置为 False。以下为示例:
<div>default 过滤器:{{ user|default('admin')}}</div>

如果 user 没有定义,那么将会使用 ‘admin’ 作为默认的值。

<div>default 过滤器:{{""|default('admin', boolean=True)}}</div>

因为“”(空字符串)是一个放到 if 后面返回 False 的值,这时候如果想要使用默认值 ‘admin’,就必须加上 boolean=True 参数。

  1. escape(value):将一些特殊字符,比如:&,<,>,”,’ 进行转义。因为 Jinja2 默认开启了全局转义,所以在大部分情况下无需手动使用这个过滤器去转义,只有在关闭转义的情况下,会需要使用到它。
  2. filesizeformate(value, binary=False):将值格式化成方便人类阅读的单位。比如 13KB、4.1MB、102Bytes 等。默认是 Mega、Giga,也就是每个相邻单位换算是1000倍。如果第二个参数设置为 True,那么相邻单位换算是1024倍。
  3. first(value):返回 value 的第一个元素。
  4. float(value, default=0.0):将 value 转换为浮点类型。如果转换失败会返回 0.0。
  5. format(value, *args, **kwargs):格式化字符串。
{{"%s, %s" | format(greeting, name)}}
  1. groupby(value, attribute, default=None):value 是一个序列,可以使用参数 attribute 进行分组。比如有一个 users 列表,里面的 User 都有一个 city 属性,那么按照 city 进行分组,则可以使用下列代码:
<ul>
{% for group in users|groupby("city") %}
<li>{{ group.grouper }}: {{ group.list|join(",")}} </li>
{% endfor %}
</ul>
  1. int(value, default=0, base=10):转换为整型,如果转换失败就返回 0 ,并且默认是按照十进制进行转换。
  2. join(value, attribute): 将一个序列,使用 attribute 指定的元素,拼接成一个字符串。跟 python 中的 join() 方法类似。
  3. last(value):返回 value 序列的最后一个元素。
  4. length(value):返回 value 序列的长度。
  5. list(value):转换 value 为一个序列。
  6. lower(value):将 value 全部转换为小写。
  7. map(value, *args, **kwargs):将 value 这个序列都执行某个操作。比如获取 users 这个序列中的每个 User 的 username 字段:
{{ users|map(attribute='username')}}

比如想要将 titles 序列中每个元素的值都变为小写形式:

{{ titles|map('lower')}}
  1. max(value):求序列的最大值。
  2. min(value):求序列的最小值。
  3. random(value):返回 value 这个序列中的一个随机值。
  4. reject(value, *args, **kwargs):过滤 value 这个序列中的一些元素。过滤的条件通过后面的参数给定。比如要过滤列表中所有的奇数,可以把 Jinja2 中内置的 odd 过滤器传给 reject 过滤器来实现:
{{ numbers|reject(attribute('odd')}}
  1. rejectattr(value, *args, **kwargs):根据 value 序列中元素上的某个属性进行过滤。只要这个属性满足条件,那么就会被过滤掉:
{{ users|rejectattr(attribute('is_active')}}
{{ users|rejectattr(attribute('email','none')}}

第一个过滤的是 users 中 is_active 为 True 的对象,第二个是过滤掉 users 中 email 为 none 的对象。

  1. repalce(value, old, new, count):将字符串 value 中的 old 替换为 new,并且可以通过 count 来确定替换多少个。跟 python 中字符串的 replace() 用法一致。
  2. reverse(value):将 value 这个序列逆序。
  3. safe(value):在渲染 value 的时候,关闭自动转义。比如:
<div> safe 过滤器:{{"<p style='background-color: red;' }} 中国 </p>"| safe}}</div>

因为加了 safe 过滤器,就不会对前面的字符串进行转义,前面的字符串就会被当成html 代码嵌入到网页中,从而看到一个红色的背景,背景中显示“中国”两个字。

  1. select(value, *args, **kwargs):选择 value 序列中满足条件的元素。跟 reject() 正好相反。
  2. selectattr(value, *args, **kwargs):根据 value 序列中元素上的某个属性进行过滤,留下满足条件的,过滤掉不满足条件的。跟 rejectattr() 相反。
  3. sort(value, reverse=False, case_sensitive=False, attribute=None):将 value 这个序列进行排序,底层用的 python 的 sorted() 函数,reverse 表示是否逆向排序, case_sensitive 表示是否忽略大小写,attribute 表示根据 value 序列中元素的某个属性排序。
  4. string(value):将 value 转换为字符串类型。
  5. striptags(value):将字符串 value 中的 html 标签去除掉,留下文本内容。
  6. tojson(value):将 value 转换为 json 格式的字符串。
  7. trim(value):删除 value 前面和后面的空白字符。
  8. truncate(value, length=255, killword=False, end='...'):将字符串 value 进行截取,length 表示保留多少个字符,killwords 表示在截取字符串的时候是否要裁剪单词, end 表示末尾的结束字符。
  9. unique(value, case_sensitive=False, attribute=None):将 value 序列中的重复元素删掉。
  10. upper(value):将 value 全部转换为大写。
  11. urlencode(value):如果 value 是字符串,那么底层会调用 python 的 urllib.parse.quote;如果 value 是字典,那么底层会调用 urllib.parse.urlencode。
  12. urlize(value, trim_url_limit=None, nofollow=False, target=None, rel=None, extra_schemes=None):将 value 变成可以点击的链接,比如 URL 和邮箱。前提是 value 必须是以 http://、https://、www 开头的字符串。
  13. wordcount(value):统计 value 中总共有多少个单词。
  14. xmlattr(value, autospace=True):value 为一个字典,根据这个字典,创建一个 xml 格式的属性,示例代码如下:
<ul {{ {'class':'my_list', 'missing':none, 'id':'list-%d|format(variable)} |xmlattr}}>
···
</ul>

过滤器可以嵌套使用:

{{ titles|map ('lower')| join('.')}}

在解析模板的时候,会先将 titles 传给 map 过滤器处理,得到的结果再传给 join 过滤器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-security authentication persistence

翻译版本【spring-security 6.2.1】persistence Persisting Authentication 用户第一次请求受保护的资源时&#xff0c;系统会提示他们输入凭据。提示输入凭据的最常见方法之一是将用户重定向到登录页面。未经身份验证的用户请求受保护的资源的HTTP交换可能如下所示: 例1。未…

关于Linux和消息队列常见的十道面试题

实际工作中如何排查CPU飙升问题&#xff1f; 在实际工作中&#xff0c;我们可以通过以下步骤来排查CPU飙升的问题&#xff1a; 使用系统监控工具&#xff1a;首先&#xff0c;我们可以使用系统监控工具&#xff0c;如top命令&#xff0c;来查看所有进程占系统CPU的排序。这样可…

编程笔记 html5cssjs 079 JavaScript 循环语句

编程笔记 html5&css&js 079 JavaScript 循环语句 循环语句1. for 循环2. while 循环3. do...while 循环4. for...in 循环5. for...of 循环 小结 在JavaScript中&#xff0c;有几种不同的循环语句用于执行重复的代码块。 循环语句 以下是一些主要的循环类型及其详解与示…

PHP三级分类数据处理

一、原始数据 function getDatas(){return [[component > system,redict > /system,path > /system,hidden > 1,name > 系统管理,children > [[component > user,redict > /user,path > /user,hidden > 1,name > 用户管理,children > [[c…

倒计时63天

e/f/j e:&#xff0c;&#xff0c;&#xff0c;一道e题卡我2个多h&#xff0c;幸好之后去写i题了&#xff0c;不然就完了╥﹏╥... E-Tokitsukaze and Eliminate (easy)_2024牛客寒假算法基础集训营2 (nowcoder.com) 我的思路&#xff1a;倒过来看不同个数再考虑一下1212这样…

UML---用例图,类图

用例图 用例图&#xff08;Use Case Diagram&#xff09;主要描述系统的功能需求和参与者与系统之间的交互。它是用户与系统交互的最简表示形式&#xff0c;展现了用户和与他相关的用例之间的关系。用例图被视为系统的蓝图&#xff0c;通过它&#xff0c;人们可以获知系统不同种…

mysql:事务的特性ACID、并发事务(脏读、不可重复读、幻读、如何解决、隔离级别)、undo log和redo log的区别、相关面试题和答案

事务是一组操作的集合&#xff0c;它会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 事务的特性&#xff08;ACID&#xff09; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务是不可分割的…

Flink-1.18.1环境搭建

下载 下载flink安装包 Index of /dist/flink/flink-1.18.1 下载flink-cdc安装包 Release Release 3.0.0 ververica/flink-cdc-connectors GitHub 安装 添加环境变量 vi ~/.bash_profile export FLINK_HOME=/home/postgres/flink/flink-1.18.1 export PATH=$PATH:$FL…

idea开发工具的简单使用与常见问题

1、配置git 选择左上角目录file->setting 打开&#xff0c;Version Control 目录下Git&#xff0c;选择git安装目录下的git.exe文件&#xff1b; 点击test&#xff0c;出现git版本&#xff0c;则表示git识别成功&#xff0c;点击右下角确认即可生效。 2、配置node.js 选…

ubuntu开机报错/dev/nume0n1p2:clean

本来是开机卡在这个界面&#xff0c;经过以下操作&#xff0c;变成这种了 现在的问题变成linux卡在 failed to start NVIDIA Persistence Daemon 按照下面的操作方法&#xff0c;可以有开机界面了。但是输入密码后&#xff0c;一直在登录界面 1.方式一&#xff1a;重新安装显…

Prometheus主机相关指标表达式整理

问题描述 需要通过Prometheus采集监控的主机节点的cpu使用率、内存使用率、磁盘使用率等指标数据&#xff0c;并根据topk排序筛选出前topN的主机。对过程进行一下记录。 表达式 //磁盘读速率top10private final static String TOP10_DISK_READ "topk(10,sum(irate(node…

.gitlab-ci.yml文件参数

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

TypeScript 学习笔记(Day4)

「写在前面」 本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. TypeScript 学习笔记&#xff08;Day1&#xff09; 2. TypeScript 学习笔…

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项&#xff0c;用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间&#xff0c;如果在指定的时间内没有数据可读取&#xff0c;将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下&#xff0c;SO_TIMEOUT选项的值…

SystemVerilog约束随机(二)

文章目录 前言一、SystemVerilog约束随机1.1 集合操作set membership1.2 权重约束weighted constraints1.3 队列约束array constranint1.4 条件约束order constraints1.5 等价约束equivalence constraints1.6 顺序约束solver order 总结 前言 这里主要记录一下systemverilog中…

【Rust】——rust前言与安装rust

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

ACM训练题:Division

题意是给你N&#xff0c;打印出所有相除等于N的五位数&#xff08;包含前导零&#xff09;&#xff0c;可以枚举后五位&#xff0c;计算量是10&#xff01;/5&#xff01;&#xff0c;然后乘N&#xff0c;一起检验10个数是否都出现。 AC代码&#xff1a; #include <iostre…

蓝桥杯省赛无忧 课件111 带权并查集

01 什么是带权并查集&#xff1f; 02 算法原理 03 经典例题分析

Flutter和Dart中Future是一个非常重要的概念

在Flutter和Dart中&#xff0c;Future是一个非常重要的概念&#xff0c;用于表示一个异步操作的最终结果。Dart是一门单线程的语言&#xff0c;但为了执行耗时的操作&#xff08;如网络请求、文件I/O等&#xff09;而不阻塞主线程&#xff0c;Dart引入了异步编程模型。 Future…

uniapp踩坑之项目:简易版不同角色显示不一样的tabbar和页面

1. pages下创建三个不同用户身份的“我的”页面。 显示第几个tabbar&#xff0c;0是管理员 1是财务 2是司机 2. 在uni_modules文件夹创建底部导航cc-myTabbar文件夹&#xff0c;在cc-myTabbar文件夹创建components文件夹&#xff0c;在components文件夹创建cc-myTabbar.vue组件…