wtforms内置的校验器和自定义校验器的三种方法总结

时间:2024-04-01 10:15:13

wtforms框架官方关于自定义校验器的参考:https://wtforms.readthedocs.io/en/stable/validators.html#setting-flags-on-the-field-with-validators  

 

wtforms内置的校验器大全

Class wtforms.validators.DataRequired(message=None)

此验证器将会检测field是否输入了数值,实际上是进行了if field.data操作。并且,如数数据是一个字符串,那么只包含空格的字符串将会被认为是False。
参数:message-当验证失败时返回的错误消息数:message-当验证失败时返回的错误消息

class wtforms.validators.Email(message=None)

此验证器验证Email的地址,注意只会验证Email的格式,最好在使用的时候你能够自己校验他的真实性,比如**或者查找
参数:message-当验证失败时返回的错误消息验证失败时返回的错误消息

class wtforms.validators.EqualTo(fieldname, message=None)

用于比较两个Field的数据是否相等。
参数: filedname-你要比较的另一个Field的名称
message-当验证失败时返回的错误消息,可以用%(other_label)s和 %(other_name)s来更提供更多的错误消息
此验证器可用于验证一个或者多个相同field的情景,更改密码的代码

class wtforms.validators.InputRequired(message=None)

用于验证field有数据输入,注意与DataRequired的区别,InputRequired主要看是否输入了数据,而DataRequired用于那些强制Post的数据

class wtforms.validators.IPAddress(ipv4=True, ipv6=False, message=None)

ipv4-当为Ture时,允许有效的IPv4地址(默认为True)
ipv6-当为Ture时,允许有效的IPv6地址(默认为False)
参数:message-当验证失败时返回的错误消息

class wtforms.validators.Length(min=-1, max=-1,message=None)

验证字符串的长度
min-输入的最小的字符串长度,如果未指定,则不校验最小字符串
max-输入的最大的字符串长度,如果未指定,则不校验最大字符串
message-当验证失败时返回的错误消息,如果需要,可以通过%(min)d,%(max)d来自行设置

class wtforms.validators.NumberRange(min=None, max=None,message=None)

用于验证数据是否在最小值与最大值之间,支持的常用的数据类型,如float等,不只是int
min-输入的最小的字符串长度,如果未指定,则不校验最小字符串
max-输入的最大的字符串长度,如果未指定,则不校验最大字符串
message-当验证失败时返回的错误消息,如果需要,可以通过%(min)d,%(max)d来自行设置

class wtforms.validators.Regexp(regex, flags=0, message=None)

通过正则表达式验证
regex-正则表达式,也可以通过参数传递
flags-regex使用标示,如re.IGNORECASE,如果regex不是一个字符串将忽略
message-当验证失败时返回的错误消息

 

class wtforms.validators.URL(require_tld=True, message=None)

通过正则表达式对URL进行简单的验证,与Email验证器相似,可能在之后需要其他的方式验证其真实性
require_tld-当设置为True时,必须在域名中包含*域名等,当需要验证localhost时设置为False

 

 自定义验证器 - namefield验证器(推荐使用)

在类里面,编写 def validate_namefieldxxx(form, field)函数,通过raise ValidationError提示错误信息,编写在类里面的验证器,不需要在显示在feild里面指定validators=, 比如

重要提示: namefield校验器只能有一个参数field,因为是在自己类内部,如果添加form参数会报错!

class LoginForm(Form):

    openid = StringField('openid', validators=[DataRequired()])

    remember_me = BooleanField('remember_me', default=False)

    # 在校验类内部函数的名字规则是固定的validate_属性名(这样wtforms才会自动识别)
    # 这样定义的格式,无需在validators中再次添加!
    # 这里只能有一个参数field,因为是在自己类内部,如果添加form参数会报错!
    def validate_remember_me(self,field):

        if field.data != False:

            raise ValidationError('remember_me must be False')

 

3 自定义验证器 - 把验证器编写成单独的函数

这样需要在feild里面指定validators=[ ],比如

重要提示: 单独函数验证器必须有2个参数form和field

def validate_remember_me(form, field):

    if field.data != False:

        raise ValidationError('remember_me must be False2')

      

class LoginForm(Form):

    openid = StringField('openid', validators=[DataRequired()])

    #这里把validate_remember_me添加到validators中只能是函数名,切勿执行函数!
    remember_me = BooleanField('remember_me', default=False,

                               validators=[validate_remember_me ])

 

4 自定义验证器 - 把验证器编写成单独的类

这样需要在feild里面指定validators=[ ],比如

细节请看注释,核心就是__call__函数的用法(def __call__(self,form, field)参数由继承的Form自动提供)

__call__函数,当实例作为函数“调用”时调用;【比如:MyValidators类的实例对象是my = MyValidators(),那么调用my()函数--把实例对象my当做函数调用的时候,会调用__call__】

重要提示: 单独类验证器必须有2个参数form和field

from wtforms import Form, StringField, validators, PasswordField,ValidationError


#wtforms自定义校验器参考格式
class MyValidators(Form):

    #__call__函数创建对象之后,系统自动调用,变量from(校验器)和field(字段)分别由wtforms的From自动提供!
    def __call__(self,form, field):
        if len(str(field.data)) > 8:
            raise ValidationError("自定义校验器有错误出现")



class RegisterForm(Form):
    email = StringField("email", validators=[validators.Email("邮件格式错误,请重新输入...")])
    password = PasswordField("password", validators=[validators.Length(min=6, max=16,message = "密码长度必须为6-16位" ),
                                                     MyValidators()])


reg = RegisterForm(data={"email":"[email protected]","password":"D56234455"})
reg.validate()

a = 1

wtforms内置的校验器和自定义校验器的三种方法总结