Flask-WTF表单验证全攻略

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 字段值匹配(如密码确认)
Email 邮箱格式验证
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. 核心要点

  1. CSRF保护 必须包含 {``{ form.csrf_token() }},否则表单提交会被拒绝

  2. 数据类型处理 单选框等字段使用 coerce=int 确保值类型正确

  3. 错误显示

    • form.errors 包含所有错误信息

    • field.errors 显示具体字段错误

  4. 安全配置

    复制代码
    app.config['SECRET_KEY'] = 'your_secret_key_here'
  5. 安装依赖

    复制代码
    pip install flask-wtf
    pip install wtforms

完整示例包含:表单定义 → 视图处理 → 模板渲染 → 错误处理全流程

相关推荐
古茗前端团队1 天前
急招!前端|测试|后端|产品(名额多,速来)
前端·后端·架构
喵个咪1 天前
Go-Wind HTTP 服务器从入门到精通
后端·http·go
hunterandroid1 天前
Hilt 依赖注入:从手动 new 到自动装配
后端
喵个咪1 天前
Go-Wind gRPC 服务器从入门到精通
后端·go·grpc
喵个咪1 天前
Go-Wind GraphQL 服务器从入门到精通
后端·graphql
青青子衿悠悠我心1 天前
Docker与Kubernetes的十年战争与融合
后端
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
云技纵横1 天前
@Transactional 到底要不要加 rollbackFor?一次数据不一致事故讲清楚
后端·面试
Csvn1 天前
日志分析进阶 — Logwatch 与 GoAccess 实战
后端