Flask-WTF 表单验证
1. 字段类型
| 字段对象 | 说明 |
|---|---|
| StringField | 文本字段 |
| TextAreaField | 多行文本字段 |
| PasswordField | 密码文本字段 |
| HiddenField | 隐藏文本字段 |
| DateField | 日期字段(datetime.date) |
| DateTimeField | 日期时间字段(datetime) |
| IntegerField | 整数字段 |
| DecimalField | 精确小数字段 |
| FloatField | 浮点数字段 |
| BooleanField | 复选框(True/False) |
| RadioField | 单选框组 |
| SelectField | 下拉列表 |
| SelectMultipleField | 多选下拉列表 |
| FileField | 文件上传字段 |
| SubmitField | 表单提交按钮 |
| FormField | 嵌入子表单 |
| FieldList | 同类型字段组 |
2. 验证函数
| 验证函数 | 说明 |
|---|---|
| DataRequired | 必填字段 |
| Length | 长度验证(min, max) |
| EqualTo | 字段值匹配(如密码确认) |
| 邮箱格式验证 | |
| URL | URL格式验证 |
| Regexp | 正则表达式验证 |
| IPAddress | IP地址验证 |
| NumberRange | 数值范围验证 |
| Optional | 可选字段(跳过其他验证) |
| AnyOf | 值必须在指定列表中 |
| NoneOf | 值不在指定列表中 |
3. 表单类定义
python
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, SelectMultipleField, RadioField
from wtforms.validators import DataRequired, Length, Regexp, EqualTo
class LoginForm(FlaskForm):
username = StringField(
'用户名',
validators=[DataRequired(), Length(8, 16)]
)
password = PasswordField(
'密码',
validators=[DataRequired(), Regexp(r'[0-9a-zA-Z10#%3]{6}')]
)
check_password = PasswordField(
'确认密码',
validators=[DataRequired(), EqualTo('password')]
)
select = SelectMultipleField(
'领域',
choices=[('0', 'Flask'), ('1', 'Python')],
validators=[DataRequired()]
)
radio = RadioField(
'技术栈',
choices=[(1, 'Flask'), (2, 'Web')],
coerce=int
)
submit = SubmitField('提交')
4. 视图处理
python
from flask import render_template, redirect, url_for
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
# 获取表单数据
username = form.username.data
password = form.password.data
selected = form.select.data
radio_value = form.radio.data
# 数据处理(示例)
print(f"用户: {username}, 选择: {selected}, 选项: {radio_value}")
return redirect(url_for('index'))
return render_template('login.html', form=form)
5. 模板渲染
python
<form method="post">
{{ form.csrf_token() }}
<!-- 显示全局错误 -->
{% if form.errors %}
<div class="alert">
{% for field, errors in form.errors.items() %}
{% for error in errors %}
<p>{{ error }}</p>
{% endfor %}
{% endfor %}
</div>
{% endif %}
<div class="field">
{{ form.username.label }}
{{ form.username() }}
{% if form.username.errors %}
<span class="error">{{ form.username.errors[0] }}</span>
{% endif %}
</div>
<div class="field">
{{ form.password.label }}
{{ form.password() }}
{% if form.password.errors %}
<span class="error">{{ form.password.errors[0] }}</span>
{% endif %}
</div>
<!-- 其他字段同理 -->
{{ form.submit() }}
</form>
6. 核心要点
-
CSRF保护 必须包含
{``{ form.csrf_token() }},否则表单提交会被拒绝 -
数据类型处理 单选框等字段使用
coerce=int确保值类型正确 -
错误显示
-
form.errors包含所有错误信息 -
field.errors显示具体字段错误
-
-
安全配置
app.config['SECRET_KEY'] = 'your_secret_key_here' -
安装依赖
pip install flask-wtf pip install wtforms
完整示例包含:表单定义 → 视图处理 → 模板渲染 → 错误处理全流程