16 Flask GET 和 POST 请求处理

16 Flask GET 和 POST 请求处理

在使用 Flask 开发 web 应用时,处理用户的请求是至关重要的。本文将介绍如何处理 GETPOST 请求,并结合案例进行详细讲解。

GET 请求

GET 请求通常用于从服务器获取数据。我们可以通过 Flask 的路由功能处理 GET 请求。

示例:处理 GET 请求

下面是一个简单的 Flask 应用程序,它处理 GET 请求并返回一个欢迎消息:

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

app = Flask(__name__)

@app.route('/welcome', methods=['GET'])
def welcome():
name = request.args.get('name', 'Guest')
return f'Welcome, {name}!'

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

在这个例子中,我们定义了一个路由 /welcome,当用户通过 GET 请求访问这个路由时,我们从查询参数中获取 name,如果没有提供 name,则默认值为 Guest

测试 GET 请求

你可以使用浏览器或者 curl 命令来测试这个 GET 请求:

1
curl "http://127.0.0.1:5000/welcome?name=Alice"

响应将会是:

1
Welcome, Alice!

如果你不提供 name 参数,如下所示:

1
curl "http://127.0.0.1:5000/welcome"

响应将会是:

1
Welcome, Guest!

POST 请求

POST 请求通常用于向服务器发送数据,最常见的用于表单提交。

示例:处理 POST 请求

接下来我们会创建一个简单的表单,用户可以通过这个表单提交数据。我们将处理 POST 请求,并返回用户提交的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from flask import Flask, request, render_template_string

app = Flask(__name__)

# 简单的HTML表单
FORM_HTML = '''
<form method="POST" action="/submit">
<input type="text" name="username" placeholder="Enter your name" required>
<input type="submit" value="Submit">
</form>
'''

@app.route('/')
def index():
return render_template_string(FORM_HTML)

@app.route('/submit', methods=['POST'])
def submit():
username = request.form['username']
return f'Thank you, {username}, for your submission!'

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

在这个例子中,我们定义了一个路由 /,它返回一个 HTML 表单。在用户提交表单时,它将发送一个 POST 请求到 /submit 路由,我们在这个路由中处理用户提交的数据。

测试 POST 请求

  1. 首先在浏览器中打开 http://127.0.0.1:5000/
  2. 输入你的名字,然后点击提交。

你将会看到类似下面的响应:

1
Thank you, [你的名字], for your submission!

结论

通过上述的案例,我们学习了如何在 Flask 中处理 GETPOST 请求。使用 request 对象,我们可以轻松访问用户提交的数据。掌握这两种基本的请求方式是构建 web 应用程序的基础。接下来,您可以进一步扩展此功能,处理更复杂的数据和表单。

17 Flask 表单验证实战

17 Flask 表单验证实战

在 Flask 中,表单验证是处理用户输入的重要环节。借助 Flask-WTF 库,我们可以方便地进行表单验证。本文将通过一个简单的用户注册表单示例来演示如何实现表单验证。

安装 Flask-WTF

首先,我们需要安装 Flask-WTF。在终端中运行以下命令:

1
pip install Flask-WTF

创建 Flask 应用

接下来,我们将创建一个基本的 Flask 应用程序。以下是一个简单的应用结构:

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
from flask import Flask, render_template, redirect, url_for, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, EqualTo

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key_here'

class RegistrationForm(FlaskForm):
username = StringField('用户名', validators=[DataRequired(), Length(min=2, max=20)])
password = PasswordField('密码', validators=[DataRequired(), Length(min=6, max=20)])
confirm_password = PasswordField('确认密码', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('注册')

@app.route("/register", methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
flash(f'账户创建成功,欢迎 {form.username.data}!', 'success')
return redirect(url_for('home'))
return render_template('register.html', form=form)

@app.route("/")
def home():
return "首页"

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

表单类和验证

在上面的代码中,我们定义了一个 RegistrationForm 表单类。各字段的验证器说明如下:

  • DataRequired():这是一个必填字段的验证器。
  • Length(min=2, max=20):限制用户名的长度在 2 到 20 个字符之间。
  • EqualTo('password'):确保 confirm_password 字段的值与 password 字段一致。

创建注册模板

我们需要一个 HTML 模板来显示注册表单。创建一个名为 register.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
39
40
41
42
43
44
45
46
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>注册</title>
</head>
<body>
<h1>注册</h1>
<form method="POST">
{{ form.csrf_token }}
<div>
{{ form.username.label }}<br>
{{ form.username(size=32) }}<br>
{% for error in form.username.errors %}
<span style="color: red;">{{ error }}</span><br>
{% endfor %}
</div>
<div>
{{ form.password.label }}<br>
{{ form.password(size=32) }}<br>
{% for error in form.password.errors %}
<span style="color: red;">{{ error }}</span><br>
{% endfor %}
</div>
<div>
{{ form.confirm_password.label }}<br>
{{ form.confirm_password(size=32) }}<br>
{% for error in form.confirm_password.errors %}
<span style="color: red;">{{ error }}</span><br>
{% endfor %}
</div>
<div>
{{ form.submit() }}
</div>
</form>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</body>
</html>

模板解释

  • 我们使用 {{ form.csrf_token }} 生成 CSRF 令牌,提高表单的安全性。
  • 每个输入字段旁都有错误信息提示,通过 {% for error in form.field.errors %} 遍历并显示。

运行 Flask 应用

确保以上代码和模板都正确后,运行 Flask 应用。在浏览器访问 http://127.0.0.1:5000/register,你将看到注册表单。如果填写不合规的信息,表单会显示相应的错误提示。

总结

在本节中,我们学习了如何使用 Flask-WTF 进行表单验证。关键点包括:

  • 使用 FlaskForm 方便地定义表单和验证规则。
  • 在模板中动态展示验证错误信息。
  • 保护表单免受 CSRF 攻击。

通过这些步骤,我们已成功构建了一个基本的注册表单,并实现了输入验证。希望这对你进一步掌握 Flask 开发有所帮助!

重定向与闪存消息

重定向与闪存消息

在 Flask 应用中,用户体验至关重要,而重定向和闪存消息是实现这一目标的两个重要工具。本文将详细介绍如何在 Flask 中使用这些功能,并通过具体案例帮助你更好地理解。

重定向

重定向 是指将用户的请求从一个 URL 转发到另一个 URL。在 Flask 中,可以使用 redirect() 函数来实现。

使用 redirect 函数

首先,确保你已经安装 Flask:

1
pip install Flask

接下来,我们创建一个简单的应用来演示重定向:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/')
def home():
return '欢迎来到首页!'

@app.route('/redirect_to_home')
def redirect_to_home():
return redirect(url_for('home'))

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

在以上代码中,/redirect_to_home 路由会将用户重定向到 home 路由。这里使用了 url_for() 函数来生成 home 路由的 URL,确保了 URL 的动态性。

测试重定向

运行应用后,访问 http://127.0.0.1:5000/redirect_to_home,你应该会看到页面转向 欢迎来到首页! 这条消息。

闪存消息

闪存消息 是在用户请求完成后,给用户提供反馈的信息。这些消息通常用于显示操作结果,比如表单提交成功或失败。

使用 flash 函数

Flask 提供了 flash() 函数来创建闪存消息,并且需要设置 secret_key 来使其正常工作。来看一个示例:

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
from flask import Flask, redirect, url_for, flash, render_template, request, session

app = Flask(__name__)
app.secret_key = 'your_secret_key' # 设置一个秘钥

@app.route('/')
def home():
return render_template('home.html')

@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
# 假设用户验证通过
if username == 'admin':
flash('登录成功!', 'success')
return redirect(url_for('home'))
else:
flash('登录失败,请重试。', 'danger')
return redirect(url_for('home'))

@app.route('/flash')
def show_flash_messages():
return render_template('flash.html')

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

渲染闪存消息

我们需要创建一个 HTML 模板来显示闪存消息。以下是 home.htmlflash.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
<!-- home.html -->
<!doctype html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>首页</title>
</head>
<body>
<h1>欢迎来到首页!</h1>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<ul>
{% for category, message in messages %}
<li class="{{ category }}">{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<form action="{{ url_for('login') }}" method="post">
<input type="text" name="username" placeholder="输入用户名"/>
<button type="submit">登录</button>
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- flash.html -->
<!doctype html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>闪存消息</title>
</head>
<body>
<h1>闪存消息示例</h1>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<ul>
{% for category, message in messages %}
<li class="{{ category }}">{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</body>
</html>

运行和测试

运行 Flask 应用后,访问 http://127.0.0.1:5000/。在输入框中输入 admin 进行登录,你会看到闪存消息“登录成功!”;如果输入其他名称,则显示“登录失败,请重试。”

总结

本文介绍了 Flask 中的 重定向闪存消息 的基本用法,还通过简单的示例说明了如何在实际应用中使用这些功能。掌握这些概念后,你可以更好地提升用户体验,让你的 Flask 应用更加友好!