每日一言
There isn’t anyone who doesn’t feel regret or sadness. — Lavi from D.Gray-man
模板继承
模板继承是Flask(使用Jinja2引擎)中一个强大的功能,允许你创建基础模板然后在子模板中扩展和重写特定部分。这种方式可以避免重复代码,保持一致的页面布局。
flask模板继承主要涉及两个部分:
- 基础模板:父模板,用于继承的基本的框架
- 子模板:派生于父模板,用于在父模板的基础上填充和覆盖
注意:子模版无法在父模板没有预留的地方进行添加和修改
使用示例
首先我们创建父模板文件 templates/base.html
<!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
{% 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应用中,要使用模板,需要先引入头文件:
from flask import Flask,reder_template
然后在视图函数中,需要使用 render_template()函数返回子模版,模板中的参数可以通过关键字参数传递:
@app.route('/')
def index():
return render_template('index.html',now = datetime.now());
在html中使用的参数一定要传参,否则会返回状态码500,表示服务器内部错误。
过滤器
过滤器用于对模板中传入变量的数据格式进行处理,可以让页面显式更加整齐,规范。
字符串操作过滤器
capitalize
将字符串首字母大写:
{{ name|capitalize }}
<!-- 'john' 变成 'John' -->
lower
将字符串转为小写:
{{ name|lower }}
<!-- 'JOHN' 变成 'john' -->
upper
将字符串转为大写:
{{ name|upper }}
<!-- 'john' 变成 'JOHN' -->
title
将字符串中每个单词首字母大写:
{{ title|title }}
<!-- 'hello world' 变成 'Hello World' -->
trim
去除字符串首尾的空白字符:
{{ value|trim }}
<!-- ' hello ' 变成 'hello' -->
striptags
去除HTML标签:
{{ value|striptags }}
<!-- '<p>text</p>' 变成 'text' -->
replace(old, new[, count])
替换字符串:
{{ value|replace('world', 'Jinja2') }}
<!-- 'hello world' 变成 'hello Jinja2' -->
数字操作过滤器
-
int{{ number|int }} <!-- '5.5' 变成 5 --> -
float{{ number|float }} <!-- '5' 变成 5.0 --> -
abs{{ number|abs }} <!-- -5 变成 5 --> -
roud(precision=0,method='common'){{ 3.1415926|round(2) }} <!-- 显示为 3.14 -->
列表操作过滤器
-
first{{ [1, 2, 3]|first }} <!-- 显示 1 --> -
last{{ [1, 2, 3]|last }} <!-- 显示 3 --> -
length/count{{ users|length }} <!-- 如果users有3个元素,显示 3 --> -
join(delimiter){{ ['Python', 'Flask', 'Jinja2']|join(', ') }} <!-- 显示 'Python, Flask, Jinja2' --> -
sort{{ [3, 1, 2]|sort }} <!-- 显示 [1, 2, 3] --> -
reverse{{ [1, 2, 3]|reverse }} <!-- 显示 [3, 2, 1] -->
格式化过滤器
-
date(format="格式字符串"){{ some_date|date('%Y-%m-%d') }} <!-- 如 '2025-03-02' --> -
default(value,default_value='默认值'){{ user_name|default('匿名') }} <!-- 当user_name不存在或为空时,显示'匿名' -->
自定义过滤器
在Flask应用中,可以注册自定义过滤器:
在Flask应用中通过如下方式注册一个自定义的过滤器:
@app.template_filter('reverse_string')
def reverse_string(s):
return s[::-1]
宏和模板包含
宏是可以重用的模板片段。模板运行允许在一个模板中插入另一个模板的内容。
创建宏
首先我们在文件 templates/macros.html 中定义一个宏如下:
{% macro render_list2html(items) %}
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endmacro %}
这个模板可以将python中的一个列表转为html中的一个列表。
使用宏
然后我们在 templates/index.html中使用该模板:
<main>
{# 导入宏 #}
{% from "macros.html" import render_list2html %}
<h1>items</h1>
{{ render_list2html(items) }}
</main>
这样在渲染时,我们就能轻松使用宏将所有的python列表展示出来。减少了重复代码,让写html文件也如同函数调用一般。
模板上下文
视图函数中传递的变量可以在模板中直接使用:
视图函数:
@app.route('/profile/<username>')
def profile(username):
user = {'name': username, 'age': 25}
return render_template('profile.html', user=user)
模板:
<h1>{{ user.name }}</h1>
<p>Age: {{ user.age }}</p>