有时候我们经常会跟前端提交的表单数据打交道,每次手写验证规则真的很繁琐。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功能一样!