在前一篇文章中,我们讨论了如何使用模板渲染和模板继承来构建具有层次结构的网页。在这一部分中,我们将专注于表单处理中的表单类内容,使用 Flask-WTF 扩展来简化表单的创建和验证。通过这个系列教程,你将能够有效地处理用户输入并确保数据的安全性和有效性。
Flask-WTF 简介
Flask-WTF 是一个与 Flask 结合使用的扩展,它使得表单的处理变得简单而高效。通过定义表单类,我们可以为每个表单字段添加验证规则,并自动生成 CSRF 令牌以保护我们的网站。
安装 Flask-WTF
在开始之前,首先确保安装了 Flask-WTF。你可以使用 pip 安装它:
创建表单类
首先,我们将创建一个简单的用户注册表单。我们会使用 Flask-WTF 中的 FlaskForm
类来定义我们的表单。
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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'
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('注册')
|
在这个例子中,我们创建了一个 RegistrationForm
类,这个类包含了三个字段:username
、password
和 confirm_password
。每个字段都有相应的验证器,这可以确保用户输入有效的内容。
表单模板
接下来,让我们在模板中渲染这个表单。创建一个名为 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
| <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>注册</title> </head> <body> <h1>注册</h1> <form method="POST" action="{{ url_for('register') }}"> {{ form.hidden_tag() }} <div> {{ form.username.label }}: {{ form.username(size=32) }} {% for error in form.username.errors %} <span style="color: red;">{{ error }}</span> {% endfor %} </div> <div> {{ form.password.label }}: {{ form.password(size=32) }} {% for error in form.password.errors %} <span style="color: red;">{{ error }}</span> {% endfor %} </div> <div> {{ form.confirm_password.label }}: {{ form.confirm_password(size=32) }} {% for error in form.confirm_password.errors %} <span style="color: red;">{{ error }}</span> {% endfor %} </div> <div> {{ form.submit() }} </div> </form> </body> </html>
|
在这个模板中,我们使用了 Flask-WTF
的 hidden_tag
方法来包含 CSRF 令牌,防止跨站请求伪造攻击。此外,我们还循环显示每个字段的错误消息,以便于用户做出相应的修改。
处理表单数据
最后,我们需要在视图函数中处理用户提交的表单数据。以下是处理用户注册的简单示例:
1 2 3 4 5 6 7 8 9 10 11
| @app.route('/register', methods=['GET', 'POST']) def register(): form = RegistrationForm() if form.validate_on_submit(): username = form.username.data password = form.password.data flash('注册成功!请登录。', 'success') return redirect(url_for('login')) return render_template('register.html', form=form)
|
在这个视图函数中,我们实例化了 RegistrationForm
并检查表单是否经过验证 (validate_on_submit()
方法会自动处理表单验证和 CSRF 检查)。如果验证成功,我们可以获取表单字段的值并进行相应的处理,例如将用户信息存储在数据库中。最后,我们使用 flash
函数来显示成功消息,并重定向用户到登录页面。
小结
在本节中,我们学习了如何使用 Flask-WTF 创建表单类并处理表单输入。通过定义表单类,我们可以将表单结构和验证逻辑集中在一个地方,从而提升代码的可维护性与安全性。
在下一篇文章中,我们将集中讨论如何处理提交的表单数据,包括与数据库的交互等内容,确保你的应用在处理用户输入时既安全又高效。继续关注系列教程,让我们一起深入学习 Flask 的奥秘!