【flask-wtf】 表单验证器

发布于:2024-11-02 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、安装库包

pip install flask-wtf

二、使用表单类创建验证器类

首先代码展示:

#从框架中引入原始类
import wtforms
from wtforms.validators import Email, Length, EqualTo
from models import UserModel
from exts import redis


class RegistrationForm(wtforms.Form):
    email = wtforms.StringField(validators=[Email(message="邮箱格式错误")])
    captcha = wtforms.StringField(validators=[Length(min=4,max=4,message="验证码格式错误")])
    username = wtforms.StringField(validators=[Length(min=3,max=20,message="用户名格式错误")])
    password = wtforms.PasswordField(validators=[Length(min=6, max=20, message="密码格式错误")])
    password_confirm = wtforms.PasswordField(validators=[EqualTo("password")])


    #自定义验证
    def validate_email(self, field):
        email = field.data
        user = UserModel.query.filter_by(email = email).first()
        if user:
            raise wtforms.ValidationError(message="该邮箱已被注册")


    def validate_captcha(self, field):
        captcha = field.data
        code = redis.get("mail:" + self.email.data).decode()
        if code!=captcha:
            raise wtforms.ValidationError(message="验证码不正确")

这里首先是需要继承原始类(wtforms.Form)来创建子类验证器类(RegistrationForm)。
然后通过表单域类型来创建相关的表单元素,这里附带了相关的验证方式。
在这里插入图片描述
可以用于验证表单填写数据正确与否的验证方法:
在这里插入图片描述
还可以通过自定义来创建验证方式:
validation_表单元素名:这里的表单元素名是前端给后端传递的元素名,需要匹配。
其中传入的self是子类验证器类的self对象,里面包含了所定义的数据,可以通过它来访问除了email之外的其他元素数据。

    #自定义验证
    def validate_email(self, field):
        email = field.data
        user = UserModel.query.filter_by(email = email).first()
        if user:
            raise wtforms.ValidationError(message="该邮箱已被注册")

三、验证器的使用

导入验证器类

from .form import RegistrationForm

使用验证器类去验证表单元素填写是否正确

#这里输入对象需要跟验证器类书里面的数据名一一对应,否则无法对应上
form = RegistrationForm(request.form)
#如果验证没有问题
if form.validate():
    # 1. 创建ORM对象
    user = UserModel(username=form.username.data, password=form.password.data, email=form.email.data, create_time=datetime.now());
    # 2. 将ORM对象添加到db.session中
    db.session.add(user);
    # 3. 将db.session中的改变同步到数据库中
    db.session.commit();
    return jsonify({"code":200,"message":"账号创建完成","data":None})
else:
    return form.errors