有时候我们经常会跟前端提交的表单数据打交道,每次手写验证规则真的很繁琐。Flask-WTF扩展模块提供了前端表单自动生成和前端表单提交数据验证的功能。


WTForms支持的HTML标准字段

字段对象 说明
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文本字段
DateField 文本字段,值为datetime.date格式
DateTimeField 文本字段,值为datetime.datetime格式
IntegerField 文本字段,值为整数
DecimalField 文本字段,值为decimal.Decimal
FloatField 文本字段,值为浮点数
BooleanField 复选框,值为True和False
RadioField 一组单选框
SelectField 下拉列表
SelectMultipleField 下拉列表,可选择多个值
FileField 文本上传字段
SubmitField 表单提交按钮
FormField 把表单作为字段嵌入另一个表单
FieldList 一组指定类型的字段


WTForms常用验证函数

验证函数 说明
DataRequired 确保字段中有数据
EqualTo 比较两个字段的值,常用于比较两次密码输入
Length 验证输入的字符串长度
NumberRange 验证输入的值在数字范围内
URL 验证URL
AnyOf 验证输入值在可选列表中
NoneOf 验证输入值不在可选列表中


register.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Register</title>
</head>
<body>
<form method="post">
    <div>用户名:<input type="text" name="username"></div>
    <div>邮  箱:<input type="text" name="email"></div>
    <div>密  码:<input type="password" name="password1"></div>
    <div>再次输入:<input type="password" name="password1"></div>
    <div><input type="submit" value="Submit"></div>
</form>
</body>
</html>


flask.py

# coding=utf-8
from flask import Flask, render_template, request
from wtforms import Form, StringField, PasswordField, validators

app = Flask(__name__)


class UserRegisterForm(Form):
    """用户注册表单验证"""
    username = StringField([validators.Length(min=4, max=10), validators.DataRequired()])
    email = StringField([validators.DataRequired()])
    password1 = PasswordField([validators.DataRequired(), validators.EqualTo("password2")])
    password2 = PasswordField([validators.DataRequired()])


@app.route('/user/register/', methods=["GET", "POST"])
def user_register():
    form = UserRegisterForm(request.form)
    if request.method == "POST" and form.validate():
        print(form.username.data)
        print(form.email.data)
        print(form.password1.data)
        print(form.password2.data)
        return "Thank you for your register!"
    return render_template("register.html")


if __name__ == '__main__':
    app.run()

    这里前端的表单是我们自己通过前端标签手写的,我在后端定义了UserRegisterForm类,将类实例化把request.form作为参数传入实例中,validate()方法验证数据格式是否正确,返回True或False。Flask中的WTForms跟Django中的Form功能一样!