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

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

相关推荐
Lee川4 小时前
mini-cursor 揭秘:从 Tool 定义到 Agent 循环的完整实现
前端·人工智能·后端
2301_803934615 小时前
Go语言如何做网络爬虫_Go语言爬虫开发教程【指南】
jvm·数据库·python
WL_Aurora5 小时前
Python爬虫实战(六):新发地蔬菜价格数据采集.
爬虫·python
盲敲代码的阿豪5 小时前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python
weixin199701080166 小时前
[特殊字符] 智能数据采集:数字化转型的“数据石油勘探队”(附Python实战源码)
开发语言·python
星浩AI6 小时前
OpenHuman 对比 OpenClaw、Hermes Agent
人工智能·后端·agent
小江的记录本6 小时前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展
次元工程师!7 小时前
LangFlow开发(三)—Bundles组件架构设计(3W+字详细讲解)
java·前端·python·低代码·langflow
t_hj7 小时前
大模型微调
人工智能·python·深度学习
范范@8 小时前
python基础-函数
开发语言·python