python+flask后端开发系列 | Jinja2模板下,过滤器的使用

发布于:2025-08-07 ⋅ 阅读:(23) ⋅ 点赞:(0)

在这里插入图片描述
简介:在 Flask 开发中,Jinja2 模板引擎是不可或缺的一部分,它不仅提供了强大的模板渲染功能,还通过 过滤器(Filters) 为模板数据处理提供了极大的灵活性。本文将探讨 Jinja2 模板中的过滤器,包括其基本概念、内置过滤器的使用,以及如何定义和使用自定义过滤器。
目录
一、Jinja2 模板的功能介绍
二、过滤器的介绍与示例代码介绍
2.1 内置过滤器
2.2 自定义过滤器
三、类和字典的封装形式
3.1 类形式
3.2 字典形式
四、高炉监控系统的简易示例
4.1 使用情景
4.2 渲染结果
结语


学完本文,你将获得以下技能:

  • 熟练运用内置过滤器:熟悉 Jinja2 提供的丰富内置过滤器,如 upper、lower、capitalize、join、trim 等,能够根据实际需求快速对模板数据进行格式化和处理。
  • 自定义过滤器开发能力:学会如何根据项目需求开发自定义过滤器,并将其注册到 Flask 应用中,从而实现更复杂的数据处理逻辑,提升模板的灵活性和可扩展性。
  • 类与字典封装技巧:掌握如何将过滤器封装为类或通过字典动态注册,使代码更加模块化、易于维护,同时便于团队协作和代码复用。
  • 简易的实际应用能力:通过高炉监控系统的功能示例,理解如何在真实项目场景中运用过滤器优化前端展示,提升用户体验,为解决实际业务问题提供有效支持。

一、Jinja2 模板的功能

Jinja2 是一个现代的、设计优雅的模板引擎,它为 Python 编程语言提供了类似 Django 模板的语法,但功能更为强大。Jinja2 的核心目标是快速、灵活且易于扩展。它支持模板继承、宏定义、自动转义等多种高级特性,使得模板开发既高效又安全。(一键直达官网Jinja2)
在 Flask 中,Jinja2 是默认的模板引擎,通过 render_template 函数将模板文件和上下文数据渲染为 HTML 页面。
以下是一个简单的 Flask 应用示例,展示了如何使用 Jinja2 模板:

  1. Flask后端app.py文件
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    context = {
        'title': '首页',
        'content': '欢迎来到首页!'
    }
    return render_template('index.html', **context)

if __name__ == '__main__':
    app.run(debug=True)
  1. 在相应templates文件下的index.html文件中:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ content }}</p>
</body>
</html>
  1. 渲染结果如下:
    在这里插入图片描述
    注意:在上述结果中,Jinja2模板支持{{}}形式包裹Flask后端传递的值,在Flask后端中,向index.html中传递了context字典,其中的数值供index.html自动检索与使用!

二、过滤器的介绍与示例代码介绍

2.1 内置过滤器

Jinja2 提供了丰富的内置过滤器,用于对模板中的变量进行格式化和处理。以下是一些常用的内置过滤器及其示例,内置过滤器直接在html中直接使用即可,使用格式为 (值) | (过滤器名称)

  1. upperlower:将字符串转换为大写或小写
<p>{{ 'Hello, World!' | upper }}</p>  <!-- 输出: HELLO, WORLD! -->
<p>{{ 'Hello, World!' | lower }}</p>  <!-- 输出: hello, world! -->
  1. capitalize:将字符串的首字母大写
<p>{{ 'hello, world!' | capitalize }}</p>  <!-- 输出: Hello, world! -->
  1. title:将字符串中的每个单词首字母大写
<p>{{ 'hello, world!' | title }}</p>  <!-- 输出: Hello, World! -->
  1. replace:替换字符串中的子字符串
<p>{{ 'Hello, World!' | replace('World', 'Flask') }}</p>  <!-- 输出: Hello, Flask! -->
  1. trim:去除字符串两端的空白字符
<p>{{ '   Hello, World!   ' | trim }}</p>  <!-- 输出: Hello, World! -->
  1. join:将列表中的元素连接成字符串
<p>{{ [1, 2, 3] | join(', ') }}</p>  <!-- 输出: 1, 2, 3 -->
  1. default:为变量提供默认值
<p>{{ undefined_var | default('默认值') }}</p>  <!-- 输出: 默认值 -->
  1. length:获取变量的长度
<p>{{ 'Hello, World!' | length }}</p>  <!-- 输出: 13 -->
<p>{{ [1, 2, 3] | length }}</p>  <!-- 输出: 3 -->

2.2 自定义过滤器

除了内置过滤器,Jinja2 允许开发者定义自己的过滤器。自定义过滤器可以通过 Flask 应用的 add_template_filter 方法注册到模板中。以下是一个自定义过滤器的示例,该过滤器用于格式化日期:

1. Flask后端代码:

from flask import Flask, render_template
from datetime import datetime

app = Flask(__name__)

@app.template_filter('datetimeformat')
def datetimeformat(value, format='%Y-%m-%d %H:%M:%S'):
	"""
    自定义过滤器,用于将日期时间对象格式化为指定的字符串格式。
    
    参数:
    - value: datetime 对象,需要被格式化的日期时间。
    - format: str,日期时间的格式化字符串,默认为 '%Y-%m-%d %H:%M:%S'。
    
    返回:
    - str,格式化后的日期时间字符串。
    """
    return value.strftime(format)

@app.route('/')
def index():
    context = {
        'title': '首页',
        'current_time': datetime.now()
    }
    return render_template('index.html', **context)

if __name__ == '__main__':
    app.run(debug=True)

2. html网页代码:
在模板文件 index.html 中,可以使用自定义的 datetimeformat 过滤器:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>当前时间:{{ current_time | datetimeformat }}</p>
</body>
</html>

3. 渲染结果:
在这里插入图片描述

三、类和字典的封装形式

3.1 类形式

在实际开发中,我们通常会将过滤器封装为类,以便更好地管理。以下是一个使用类定义过滤器的示例:

1. Flask后端代码:

from flask import Flask, render_template
from datetime import datetime

app = Flask(__name__)

class Filters:
    @staticmethod
    @app.template_filter('datetimeformat')
    def datetimeformat(value, format='%Y-%m-%d %H:%M:%S'):
        return value.strftime(format)

@app.route('/')
def index():
    context = {
        'title': '首页',
        'current_time': datetime.now()
    }
    return render_template('index.html', **context)

if __name__ == '__main__':
    app.run(debug=True)

2. HTML网页代码:
在模板文件 index.html 中,使用方式与前面的示例相同:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>当前时间:{{ current_time | datetimeformat }}</p>
</body>
</html>

3. 渲染结果:
在这里插入图片描述

3.2 字典形式

如果需要动态注册多个过滤器,可以使用字典形式。以下是一个示例:

1. Flask后端代码:

from flask import Flask, render_template
from datetime import datetime

app = Flask(__name__)

def datetimeformat(value, format='%Y-%m-%d %H:%M:%S'):
    return value.strftime(format)

def reverse(value):
    return value[::-1]

filters = {
    'datetimeformat': datetimeformat,
    'reverse': reverse
}

for name, func in filters.items():
    app.add_template_filter(func, name=name)

@app.route('/')
def index():
    context = {
        'title': '首页',
        'current_time': datetime.now(),
        'content': 'Hello, World!'
    }
    return render_template('index.html', **context)

if __name__ == '__main__':
    app.run(debug=True)

2. HTML网页代码:
在模板文件 index.html 中,可以同时使用多个过滤器:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>当前时间:{{ current_time | datetimeformat }}</p>
    <p>反转内容:{{ content | reverse }}</p>
</body>
</html>

3. 渲染结果:
在这里插入图片描述

四、高炉监控系统的简易示例

4.1 使用情景

假设我们正在开发一个高炉炼铁监控系统,需要在前端页面展示实时的炉温数据,并且希望以友好的格式显示时间戳。我们可以使用自定义过滤器来实现这一功能。

1. Flask后端代码:

from flask import Flask, render_template
from datetime import datetime

app = Flask(__name__)

@app.template_filter('datetimeformat')
def datetimeformat(value, format='%Y-%m-%d %H:%M:%S'):
    return value.strftime(format)

@app.route('/')
def index():
    context = {
        'title': '高炉监控系统',
        'current_time': datetime.now(),
        'furnace_temp': 1200  # 假设的炉温数据
    }
    return render_template('index.html', **context)

if __name__ == '__main__':
    app.run(debug=True)

2. HTML网页代码:
在模板文件 index.html 中,使用自定义的 datetimeformat 过滤器:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>当前时间:{{ current_time | datetimeformat }}</p>
    <p>炉温:{{ furnace_temp }}°C</p>
</body>
</html>

4.2 渲染结果
运行上述代码后,访问 Flask 应用的首页,将看到类似以下内容的页面:
在这里插入图片描述


结语

Jinja2 模板引擎过滤器功能为 Flask 开发提供了强大的数据处理能力。无论是内置过滤器还是自定义过滤器,都能在模板中灵活使用,极大地提升了模板的可读性和可维护性。希望本文的介绍和示例能帮助你在 Flask 开发中更好地利用 Jinja2 的这一特性。

最后,感谢你的阅读!如果你觉得本文对你有帮助,不妨点赞和关注,我会继续分享更多关于 Python 和 Flask 开发的实用知识。

关注专栏每周更新,带你从“第一个 Flask 项目”一路进阶到“Docker 部署、JWT 鉴权、微服务拆分”。

版权归作者所有,未经许可请勿转载,商用(或其它具有利益性行为)。


网站公告

今日签到

点亮在社区的每一天
去签到