Python Flask 编程 | 连载 08 - Jinja2 过滤器

一、过滤器

模板中的过滤器

模板中的过滤器可以对来自响应中数据进行处理,过滤器有以下几种使用方式:

  • 使用管道符 |,可以进行链式调用,也可以通过 () 进行传参
  • 使用 filter 标签

在 app.py 中新增视图函数 filter。

python
复制代码
@app.route('/filter')
def filter():
    name = 'Thor'
    heros = {'stark', 'clint', 'loki'}
    return render_template('filter.html', name=name, heros=heros)

在 templates 文件夹下新建 filter.html 页面。

html
复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Filter</title>
</head>
<body>
    <h2>使用管道符 |</h2>
    <p>{{ name|upper }}</p>
    <p>{{ name|lower }}</p>
    <p>{{ heros|length }}</p>
    <p>{{ heros|join('-') }}</p>
    <p>{{ heros|join('-')|length }}</p>
</body>
</html>

重新启动应用,浏览器访问 /filter,页面数据经过管道符 | 的过滤,显示结果如下:

image.png

修改 filter.html,改为通过标签方式使用过滤器,内容如下:

html
复制代码
<h2>使用filter标签</h2>
{% filter upper %}
    <p>{{ name }}</p>
{% endfilter %}
{% filter lower %}
    <p>{{ name }}</p>
{% endfilter %}
{#    注意空格#}
{% filter join('-') %}{{ name }}{% endfilter %}

保存代码后浏览器再次访问 /filter 路径,页面显示结果如下:

image.png

内置的过滤器函数生效。

常用的内置过滤器

Jinja2 模板引擎中内置了一些常用的过滤器,如:

  • {{ value | abs}}:获取 value 的绝对值
  • {{ value | default('默认值') }}{{ value | d('默认值') }}:默认值显示
  • {{ value | escape }}{{ value | e }}:HTML 转义
  • {{ value | safe }} :富文本内容转义
  • {{ value | reverse }} :反转

在 app.py 中的 filter 函数中增加一些变量,用于测试 abs 和 default 过滤器。

Python
复制代码
@app.route('/filter')
def filter():
    name = 'Thor'
    heros = {'stark', 'clint', 'loki'}
    abs_value = -1
    d_value = 1
    d_none_value = None
    return render_template('filter.html', name=name, heros=heros,
                           abs_value = abs_value, d_value = d_value,
                           d_none_value = d_none_value)

在 filter.html 页面中使用这些变量,只需在 body 标签中添加如下内容:

html
复制代码
<h2>内置过滤器</h2>
<h3>获取绝对值过滤器</h3>
<p>{{ abs_value | abs }}</p>

<h3>默认值过滤器</h3>
<p>{{ d_value | default(0) }}</p>
<p>{{ d_value_2 | default(0) }}</p>
<p>{{ d_none_value | default(0) }}</p>
<h4> defalut 过滤器默认 None 值生效</h4>
<p>{{ d_none_value | default(0, True) }}</p>

保存代码,浏览器访问 /filter,页面显示结果如下:

image.png

可以看出 default 过滤器只会对没有定义的变量起作用,当变量的值为 None 时无效。

如果先要使用默认值来取代 None 的值只需要在 default 函数中再增加一个 Bool 参数且值为 True 即可,在 filter.html 中的 body 标签中增加如下内容:

html
复制代码
<h4> defalut 过滤器默认 None 值生效</h4>
<p>{{ d_none_value | default(0, True) }}</p>

保存代码,浏览器再次访问 /filter,页面显示结果如下:

image.png

None 值已经被默认值取代。

Jinja2 模板中使用 autoescape 标签设置全局是否自动转义,如果要局部设置需要使用 escape 过滤器。

在 filter 函数中将一段 html 代码保存到变量中,并存放在上下文中。

python
复制代码
@app.route('/filter')
def filter():
    # 其余代码保持不变
    html_code = "<h4>这是一段 HTML 代码</h4>"
    return render_template('filter.html', name=name, heros=heros,
                           abs_value = abs_value, d_value = d_value,
                           d_none_value = d_none_value, html_code = html_code)

在 filter.html 中使用 escape 过滤器渲染上下文中的变量。

html
复制代码
<h2>内置过滤器</h2>
<h3>escape 过滤器</h3>
{% autoescape false %}
<p> {{ html_code | e}} </p>
<p> {{ html_code }} </p>
{% endautoescape %}

image.png

默认开启了 autoescape,因此转义 html 时加不加 escape 过滤器结果都是会被自动转义。

更多内置过滤器的使用可查看 Jinja2 官网中列出的过滤器清单。

image.png

自定义过滤器

如果模板中提供的过滤器都无法满足需求,那么就需要自定义过滤器,比如个人信息脱敏等。

自定义过滤器有两种方式,以自定义一个隐藏个人真实姓名的过滤器 name_masking 为例。

第一种方式,使用装饰器注册自定义过滤器

在 app.py 中新增函数 name_masking_filter,使用装饰器 @app.template_filter 将该函数注册为一个过滤器,装饰器后的括号中指定过滤器的名字,既可以在模板中使用的名字。

python
复制代码
@app.template_filter('name_masking')
def name_masking_filter(name):
    return name[0] + '**'

在 filter.html 页面中使用该过滤器,在 body 标签中增加如下内容:

html
复制代码
<h2>自定义过滤器使用</h2>
<p>{{ '特朗普' | name_masking }}</p>

保存代码,浏览器访问 /filter

image.png

名字已经被替换为 **

第二种方式,使用函数注册自定义过滤器

将上面使用装饰器注册过滤器的代码注释掉,只需要将装饰器注释即可,通过 Flask 对象 app 调用 jinja_env 函数来注册自定义的过滤器。

python
复制代码
def name_masking_filter(name)
    return return name[0] + '**'
    
# 注册自定义过滤器
app.jinja_env.filters['name_masking'] = name_masking_filter

保存代码,浏览器访问 /filter

image.png

过滤器生效,名字已经被替换为 **。

这里给大家分享一份Python全套学习资料,包括学习路线、软件、源码、视频、面试题等等,都是我自己学习时整理的,希望可以对正在学习或者想要学习Python的朋友有帮助!

CSDN大礼包:全网最全《全套Python学习资料》免费分享🎁

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
上述所有资料 ⚡️ ,朋友们如果有需要 📦《全套Python学习资料》的,可以扫描下方二维码免费领取 🆓
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值