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

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

相关推荐
子兮曰18 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰18 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
默_笙18 小时前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
爱勇宝18 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
qq_4260039618 小时前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫19 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码19 小时前
别再前后端各写一套表单校验了
java·后端
长沙三为智能科技19 小时前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读19 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
大勇前进19 小时前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端