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

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

相关推荐
码事漫谈8 小时前
勿删
后端
IT_陈寒12 小时前
用了Proxy才发现以前的JavaScript白写了
前端·人工智能·后端
唐青枫12 小时前
别把 ArrayList 当成会自动管理内存的 List:Zig 动态数组从入门到实战
后端
鸿蒙开发13 小时前
我为 HarmonyOS 做了一个统一大模型 SDK:@hmkit/ai 正式开源
后端
猪是念来过倒13 小时前
Semaphore 与 RateLimiter:并发控制双雄详解
后端
掘金者阿豪13 小时前
异构数据同步最怕什么?不是同步慢,而是数据对不上
后端
程序员cxuan14 小时前
Claude 官方的学习教程,太强了。
人工智能·后端·程序员
老孙讲技术14 小时前
把工地遮挡和掉线接进项目部:setMessageCallback 订 alarm 与 deviceStatus
后端·物联网·音视频开发
老孙讲技术14 小时前
关店后有人进门,监控值班群却没响:用 setMessageCallback 订 human,再用 aiHuman 打开人形
后端·物联网·音视频开发
LEE14 小时前
原来 Claude Code 最厉害的工具,一行代码都不写
前端·后端