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

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

一、过滤器

模板中的过滤器

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

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

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

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

在 templates 文件夹下新建 filter.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,改为通过标签方式使用过滤器,内容如下:

<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 过滤器。

@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 标签中添加如下内容:

<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 标签中增加如下内容:

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

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

image.png

None 值已经被默认值取代。

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

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

@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 过滤器渲染上下文中的变量。

<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 将该函数注册为一个过滤器,装饰器后的括号中指定过滤器的名字,既可以在模板中使用的名字。

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

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

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

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

image.png

名字已经被替换为 **

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

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

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

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

image.png

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



相关文章
|
23天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
22天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
10天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
101 80
|
9天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
38 2
|
22天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
44 10
|
24天前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
42 12
|
23天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
24天前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
22天前
|
人工智能 数据挖掘 开发者
探索Python编程之美:从基础到进阶
本文是一篇深入浅出的Python编程指南,旨在帮助初学者理解Python编程的核心概念,并引导他们逐步掌握更高级的技术。文章不仅涵盖了Python的基础语法,还深入探讨了面向对象编程、函数式编程等高级主题。通过丰富的代码示例和实践项目,读者将能够巩固所学知识,提升编程技能。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起踏上Python编程的美妙旅程吧!
|
25天前
|
机器学习/深度学习 人工智能 自然语言处理
探索未来编程:Python在人工智能领域的深度应用与前景###
本文将深入探讨Python语言在人工智能(AI)领域的广泛应用,从基础原理到前沿实践,揭示其如何成为推动AI技术创新的关键力量。通过分析Python的简洁性、灵活性以及丰富的库支持,展现其在机器学习、深度学习、自然语言处理等子领域的卓越贡献,并展望Python在未来AI发展中的核心地位与潜在变革。 ###