13 Jinja2 模板在 Flask 中的使用

13 Jinja2 模板在 Flask 中的使用

在 Flask 中,Jinja2 是默认的模板引擎,用于渲染动态内容。使用 Jinja2,你可以将 Python 代码与 HTML 代码分离,提高代码的组织性和可维护性。

基本概念

Jinja2 允许在 HTML 文件中嵌入 Python 代码。它提供了很多强大的功能,比如模板继承、变量替换、条件语句和循环等。

创建 Flask 应用

首先,我们创建一个简单的 Flask 应用并组织项目结构。

1
2
3
4
/my_flask_app
├── app.py
└── templates
└── index.html

app.py

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
user = {"username": "小明"}
return render_template('index.html', user=user)

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

index.html

templates/index.html 文件中,我们可以使用 Jinja2 语法来渲染数据。

1
2
3
4
5
6
7
8
9
10
11
<!doctype html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>欢迎页面</title>
</head>
<body>
<h1>欢迎, {{ user.username }}!</h1>
<p>这是一个使用 Jinja2 模板的示例。</p>
</body>
</html>

在上面的代码中,{{ user.username }}Jinja2 的变量替换语法,user 是我们在 app.py 中传递给模板的上下文数据。

模板继承

Jinja2 支持模板继承,这使得我们可以创建基础模板,并在此基础上扩展其他模板。

基础模板

创建一个基础模板 base.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!doctype html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>{% block title %}首页{% endblock %}</title>
</head>
<body>
<header>
<h1>我的网站</h1>
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
<p>版权所有 &copy; 2023</p>
</footer>
</body>
</html>

继承基础模板的页面

然后修改 index.html 以继承 base.html

1
2
3
4
5
6
7
8
{% extends "base.html" %}

{% block title %}欢迎{% endblock %}

{% block content %}
<h1>欢迎, {{ user.username }}!</h1>
<p>这是一个使用 Jinja2 模板的示例。</p>
{% endblock %}

在这里,{% extends "base.html" %} 表示当前模板继承自基础模板。{% block %}` 和 `{% endblock %} 用于定义可以被重写的区域。

条件语句与循环

Jinja2 还支持条件语句和循环,这是处理数据展示时非常实用的功能。

条件语句示例

假设我们想根据用户的登录状态显示不同的信息:

1
2
3
4
@app.route('/')
def index():
user = {"username": "小明", "is_logged_in": True}
return render_template('index.html', user=user)

index.html 中使用条件语句:

1
2
3
4
5
{% if user.is_logged_in %}
<h1>欢迎, {{ user.username }}!</h1>
{% else %}
<h1>欢迎, 访客!</h1>
{% endif %}

循环示例

如果我们想显示一组用户的列表,可以使用循环:

1
2
3
4
@app.route('/users')
def users():
user_list = [{"username": "小明"}, {"username": "小红"}, {"username": "小蓝"}]
return render_template('users.html', users=user_list)

users.html 中渲染用户列表:

1
2
3
4
5
6
<h1>用户列表</h1>
<ul>
{% for user in users %}
<li>{{ user.username }}</li>
{% endfor %}
</ul>

结论

通过使用 Jinja2 模板引擎,Flask 应用的动态内容渲染变得简洁而高效。我们可以轻松实现数据的展示、条件的判断以及循环的迭代。

掌握这部分内容是使用 Flask 和 Jinja2 开发 Web 应用的重要一步,建议多加练习以巩固理解。

14 Flask 实战教程

14 Flask 实战教程

Flask 简介

Flask 是一个使用 Python 编写的轻量级 Web 应用框架,适合快速开发小型应用。它提供了灵活性,让开发者可以自由选择使用的库和工具。

环境准备

安装 Flask

使用 pip 安装 Flask:

1
pip install Flask

创建项目结构

首先,创建项目目录并进入该目录:

1
2
mkdir my_flask_app
cd my_flask_app

然后,创建基本的文件结构:

1
2
3
4
my_flask_app/
├── app.py
├── templates/
└── static/

编写第一个 Flask 应用

app.py 中,编写一个简单的 Flask 应用:

1
2
3
4
5
6
7
8
9
10
from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
return 'Hello, Flask!'

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

运行应用

在终端中运行以下命令启动 Flask 应用:

1
python app.py

打开浏览器并访问 http://127.0.0.1:5000/,你会看到 Hello, Flask!

使用模板引擎

Flask 提供了强大的模板引擎 Jinja2,可以轻松渲染 HTML。

创建模板

templates 目录下创建 index.html

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask Template</title>
</head>
<body>
<h1>{{ title }}</h1>
</body>
</html>

修改路由以使用模板

app.py 中修改 home 函数:

1
2
3
4
5
from flask import render_template

@app.route('/')
def home():
return render_template('index.html', title='Welcome to Flask')

静态文件处理

static 目录中放置静态文件,如 CSS 或 JavaScript。

示例:使用 CSS

创建一个 styles.css 文件在 static 目录中并添加简单样式:

1
2
3
4
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
}

修改模板引入 CSS

index.html 中引入 CSS:

1
2
3
<head>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='styles.css') }}">
</head>

路由与 URL

Flask 的路由非常灵活,可以带参数的路由。

示例:参数路由

修改 app.py 添加带参数的路由:

1
2
3
@app.route('/user/<username>')
def show_user_profile(username):
return f'用户:{username}'

访问 http://127.0.0.1:5000/user/Flask,将显示 用户:Flask

表单处理

创建表单

在模板中添加一个简单表单:

1
2
3
4
<form action="/submit" method="POST">
<input type="text" name="username" placeholder="Enter your name">
<input type="submit" value="Submit">
</form>

处理表单提交

app.py 中添加处理逻辑:

1
2
3
4
5
6
from flask import request

@app.route('/submit', methods=['POST'])
def submit():
username = request.form['username']
return f'提交的用户名:{username}'

数据库集成

Flask 常与数据库一起使用,最常用的是 SQLite

安装 SQLite

使用 pip 安装 Flask-SQLAlchemy

1
pip install Flask-SQLAlchemy

配置数据库

app.py 中添加数据库配置:

1
2
3
4
from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)

定义模型

定义一个用户模型:

1
2
3
4
5
6
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(150), nullable=False, unique=True)

def __repr__(self):
return f"User('{self.username}')"

创建数据库

在 Python 交互式环境中,创建数据库:

1
2
from app import db
db.create_all()

结束语

Flask 是一个简洁且功能强大的框架,适合快速开发 Web 应用。通过本教程的学习,你已经掌握了 Flask 的基本使用方法。接下来,可以深入学习 Flask 的高级特性与最佳实践。

模板过滤器

模板过滤器

在 Flask 中,模板过滤器是一种对模板变量进行转换和格式化的强大工具。了解如何使用过滤器可以大大增强你在渲染网页时的灵活性和可读性。

什么是模板过滤器?

模板过滤器允许你在 Jinja2 模板中对变量进行修改。例如,可以对字符串进行格式化,处理日期,或是对列表进行排序等。

1
{{ variable | filter_name }}

在这个格式中,variable 是你要处理的值,而 filter_name 是你想应用的过滤器的名字。

常用内置过滤器

safe

safe 过滤器用于标记字符串为安全,使得 Jinja2 不会对其进行自动转义。适合用于输出 HTML 内容。

1
<p>{{ "<strong>Hello, World!</strong>" | safe }}</p>

capitalize

capitalize 过滤器将字符串的首字母大写,其他字母小写。

1
<p>{{ "hello, world!" | capitalize }}</p>  <!-- 输出:Hello, world! -->

lowerupper

lower 将字符串转换为小写,upper 转换为大写。

1
2
<p>{{ "Flask Tutorial" | lower }}</p>  <!-- 输出:flask tutorial -->
<p>{{ "Flask Tutorial" | upper }}</p> <!-- 输出:FLASK TUTORIAL -->

length

length 过滤器用于获取列表或字符串的长度。

1
<p>{{ ["apple", "banana", "cherry"] | length }}</p>  <!-- 输出:3 -->

join

join 过滤器将列表中的元素连接成一个字符串,使用指定的分隔符。

1
<p>{{ ["apple", "banana", "cherry"] | join(", ") }}</p>  <!-- 输出:apple, banana, cherry -->

自定义过滤器

你可以定义自己的过滤器,以满足特定的需求。以下是一个简单的示例,在 Flask 应用中创建一个自定义过滤器,该过滤器将字符串反转。

定义自定义过滤器

在 Flask 应用的初始化代码中定义过滤器:

1
2
3
4
5
6
7
from flask import Flask

app = Flask(__name__)

@app.template_filter('reverse')
def reverse_filter(s):
return s[::-1]

使用自定义过滤器

在模板中使用自定义过滤器:

1
<p>{{ "Hello, World!" | reverse }}</p>  <!-- 输出:!dlroW ,olleH -->

结合案例:使用模板过滤器显示用户信息

假设我们有一个用户字典,并希望在网页上以更友好的方式显示这些信息。

Flask 视图

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
user_info = {
'name': 'flask_user',
'bio': 'flask is awesome!'
}
return render_template('index.html', user=user_info)

模板代码

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>User Profile</title>
</head>
<body>
<h1>User Profile</h1>
<p>Name: {{ user.name | capitalize }}</p>
<p>Bio: {{ user.bio | upper }}</p>
</body>
</html>

运行效果

运行以上代码后,访问首页会显示:

1
2
Name: Flask_user
Bio: FLASK IS AWESOME!

总结

Flask 中的模板过滤器是一个非常实用的特性,让你能够轻松地对数据进行格式化处理。在本文中我们讨论了常用的内置过滤器和如何创建自定义过滤器。通过实际案例,展示了如何在真实应用中利用过滤器来增强模板的表现力。

运用好这些过滤器,可以让你的 Flask 应用更加灵活和好用。Happy coding!