jinjia2过滤器使用

flaskjinjia2操作

Posted by Carlos on January 15, 2023

当在Flask中使用模板时,过滤器是非常有用的工具。过滤器用于对模板中的变量进行处理和转换,以生成所需的输出。Flask提供了一些内置的过滤器,同时我们也可以自定义自己的过滤器。

使用自带的过滤器

Flask提供了一些常用的内置过滤器,以下是其中一些常用的过滤器的示例:

  1. safe:标记变量为安全的,并防止Flask对其进行自动转义。例如:{{ variable|safe }}

  2. capitalize:将字符串的首字母大写。例如:{{ "hello"|capitalize }}结果为”Hello”。

  3. lower:将字符串转换为小写。例如:{{ "HELLO"|lower }}结果为”hello”。

  4. upper:将字符串转换为大写。例如:{{ "hello"|upper }}结果为”HELLO”。

  5. title:将字符串中的每个单词的首字母都大写。例如:{{ "hello world"|title }}结果为”Hello World”。

  6. truncate:将字符串截断为指定的长度,并添加省略号(…)作为结尾。例如:{{ "This is a long text."|truncate(10) }}结果为”This is a…“。

通过上述示例,您可以将这些过滤器应用于模板中的变量,以便根据需要对其进行处理和转换。

自定义过滤器示例

除了Flask内置的过滤器,我们还可以创建自定义的过滤器。下面是一个示例,展示如何创建自定义的过滤器来格式化日期和长度:

首先,创建方法format_date、format_length。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from datetime import datetime

def format_date(date):
    # 格式化日期
    return date.strftime("%Y-%m-%d")

def format_length(length):
    # 格式化长度
    if length < 1024:
        return f"{length} B"
    elif length < 1024 ** 2:
        return f"{length / 1024:.2f} KB"
    else:
        return f"{length / (1024 ** 2):.2f} MB"

然后,在主应用程序文件(例如app.py)中导入Flask和自定义过滤器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from flask import Flask, render_template

app = Flask(__name__)

# 注册自定义过滤器到应用程序上下文中
app.jinja_env.filters['format_date'] = format_date
app.jinja_env.filters['format_length'] = format_length

@app.route('/')
def index():
    now = datetime.now()  # 当前时间
    file_size = 2048000  # 文件大小,以字节为单位
    return render_template('index.html', now=now, file_size=file_size)

if __name__ == '__main__':
    port_value = int(random.randint(5000, 8000))
    app.run(debug=True,host='0.0.0.0', port=port_value)

接下来,创建一个名为index.html的模板文件,并在其中使用自定义过滤器:

当使用Flask模板引擎时,可以在index.html中使用各种过滤器来处理和转换变量。下面是一个包含所有过滤器示例的index.html文件,并配有相应的注释说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html>
<head>
    <title>Template Filters</title>
</head>
<body>
    <!-- 使用内置过滤器 -->
    <h2>{{ "hello world"|upper }}</h2>

    <!-- 使用自定义过滤器 -->
    <h2>{{ "hello world"|reverse }}</h2>

    <!-- 使用多个过滤器 -->
    <h2>{{ "hello world"|upper|reverse }}</h2>

    <!-- 使用过滤器链式调用 -->
    <h2>{{ "hello world"|upper|truncate(5, True) }}</h2>

    <!-- 使用过滤器传递参数 -->
    <h2>{{ "hello world"|truncate(5) }}</h2>

    <!-- 使用过滤器处理变量 -->
    {% set name = "john" %}
    <h2>{{ name|capitalize }}</h2>

    <!-- 使用过滤器迭代列表 -->
    {% set fruits = ["apple", "banana", "orange"] %}
    <ul>
        {% for fruit in fruits %}
            <li>{{ fruit|capitalize }}</li>
        {% endfor %}
    </ul>

    <h1>自建过滤器</h1>
    <p>Date: {{ now|format_date }}</p>
    <p>File Size: {{ file_size|format_length }}</p>
</body>
</html>

请注意,自定义过滤器需要在Flask应用程序中注册,并且过滤器函数需要事先定义和实现。在这个示例中,我们假设已经注册了名为format_dateformat_length的自定义过滤器。