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
完整示例包含:表单定义 → 视图处理 → 模板渲染 → 错误处理全流程