Flask模板补充

每日一言

There isn’t anyone who doesn’t feel regret or sadness. – Lavi
from D.Gray-man

模板继承

模板继承是Flask(使用Jinja2引擎)中一个强大的功能,允许你创建基础模板然后在子模板中扩展和重写特定部分。这种方式可以避免重复代码,保持一致的页面布局。

flask模板继承主要涉及两个部分:

  • 基础模板:父模板,用于继承的基本的框架
  • 子模板:派生于父模板,用于在父模板的基础上填充覆盖

注意:子模版无法在父模板没有预留的地方进行添加和修改

使用示例

首先我们创建父模板文件 templates/base.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}My Website{% endblock %}</title> //可替换区域
</head>
<body>
<header>
<h1>My Website</h1>
</header>
<main>
{% block content %}{% endblock %} //可替换区域
</main>
<footer>
<p>Footer content</p>
</footer>
</body>
</html>

然后我们创建一个子模版 templates/index.html

1
2
3
4
5
6
7
8
9
10
{% extends "base.html" %}	//声明继承自父模板

{% block title %}Home Page{% endblock %}

{% block content %}
<h2>Welcome to the Home Page!</h2>
<p>Content goes here.</p>
<p>{{now.year}}</p>
{% endblock %}

在Falsk应用中,要使用模板,需要先引入头文件:

1
from flask import Flask,reder_template 

然后在视图函数中,需要使用 render_template()函数返回子模版,模板中的参数可以通过关键字参数传递:

1
2
3
@app.route('/')
def index():
return render_template('index.html',now = datetime.now());

在html中使用的参数一定要传参,否则会返回状态码500,表示服务器内部错误。

过滤器

过滤器用于对模板中传入变量的数据格式进行处理,可以让页面显式更加整齐,规范。

字符串操作过滤器

  1. capitalize

将字符串首字母大写:

1
2
{{ name|capitalize }}
<!-- 'john' 变成 'John' -->
  1. lower

将字符串转为小写:

1
2
{{ name|lower }}
<!-- 'JOHN' 变成 'john' -->
  1. upper

将字符串转为大写:

1
2
{{ name|upper }}
<!-- 'john' 变成 'JOHN' -->
  1. title

将字符串中每个单词首字母大写:

1
2
{{ title|title }}
<!-- 'hello world' 变成 'Hello World' -->
  1. trim

去除字符串首尾的空白字符:

1
2
{{ value|trim }}
<!-- ' hello ' 变成 'hello' -->
  1. striptags

去除HTML标签:

1
2
{{ value|striptags }}
<!-- '<p>text</p>' 变成 'text' -->
  1. replace(old, new[, count])

替换字符串:

1
2
{{ value|replace('world', 'Jinja2') }}
<!-- 'hello world' 变成 'hello Jinja2' -->

数字操作过滤器

  1. int

    1
    2
    {{ number|int }}
    <!-- '5.5' 变成 5 -->
  2. float

    1
    2
    {{ number|float }}
    <!-- '5' 变成 5.0 -->
  3. abs

    1
    2
    {{ number|abs }}
    <!-- -5 变成 5 -->
  4. roud(precision=0,method='common')

    1
    2
    {{ 3.1415926|round(2) }}
    <!-- 显示为 3.14 -->

列表操作过滤器

  1. first

    1
    2
    {{ [1, 2, 3]|first }}
    <!-- 显示 1 -->
  2. last

    1
    2
    {{ [1, 2, 3]|last }}
    <!-- 显示 3 -->
  3. length/count

    1
    2
    {{ users|length }}
    <!-- 如果users有3个元素,显示 3 -->
  4. join(delimiter)

    1
    2
    {{ ['Python', 'Flask', 'Jinja2']|join(', ') }}
    <!-- 显示 'Python, Flask, Jinja2' -->
  5. sort

    1
    2
    {{ [3, 1, 2]|sort }}
    <!-- 显示 [1, 2, 3] -->
  6. reverse

    1
    2
    {{ [1, 2, 3]|reverse }}
    <!-- 显示 [3, 2, 1] -->

格式化过滤器

  1. date(format="格式字符串")

    1
    2
    {{ some_date|date('%Y-%m-%d') }}
    <!-- 如 '2025-03-02' -->
  2. default(value,default_value='默认值')

    1
    2
    {{ user_name|default('匿名') }}
    <!-- 当user_name不存在或为空时,显示'匿名' -->

自定义过滤器

在Flask应用中,可以注册自定义过滤器:

在Flask应用中通过如下方式注册一个自定义的过滤器:

1
2
3
@app.template_filter('reverse_string')
def reverse_string(s):
return s[::-1]

宏和模板包含

宏是可以重用的模板片段。模板运行允许在一个模板中插入另一个模板的内容。

创建宏

首先我们在文件 templates/macros.html 中定义一个宏如下:

1
2
3
4
5
6
7
{% macro render_list2html(items) %}
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endmacro %}

这个模板可以将python中的一个列表转为html中的一个列表。

使用宏

然后我们在 templates/index.html中使用该模板:

1
2
3
4
5
6
   <main>
{# 导入宏 #}
{% from "macros.html" import render_list2html %}
<h1>items</h1>
{{ render_list2html(items) }}
</main>

这样在渲染时,我们就能轻松使用宏将所有的python列表展示出来。减少了重复代码,让写html文件也如同函数调用一般。

模板上下文

视图函数中传递的变量可以在模板中直接使用:

视图函数:

1
2
3
4
@app.route('/profile/<username>')
def profile(username):
user = {'name': username, 'age': 25}
return render_template('profile.html', user=user)

模板:

1
2
<h1>{{ user.name }}</h1>
<p>Age: {{ user.age }}</p>

Flask模板补充
http://blog.ulna520.com/2025/03/01/Flask模板补充_20250301_214029/
Veröffentlicht am
March 1, 2025
Urheberrechtshinweis