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

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

相关推荐
颜酱15 分钟前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
喵手34 分钟前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_9449347338 分钟前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy1 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
肖永威2 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
TechWJ2 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
枷锁—sha3 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_3 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
abluckyboy3 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
喵手3 小时前
Python爬虫实战:构建各地统计局数据发布板块的自动化索引爬虫(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集数据csv导出·采集各地统计局数据发布数据·统计局数据采集