Flask WTForms:DataRequired和InputRequired之间的区别

Rya*_*yan 19 python flask wtforms flask-wtforms

有什么区别DataRequiredInputRequiredwtforms.valiadators

我的注册表单中有一些字段:

username
password 
password_repeat 
submit
Run Code Online (Sandbox Code Playgroud)

这些字段应该使用DataRequired还是InputRequired验证器?

nsf*_*n55 30

简答

除非你有充分的理由你应该使用 InputRequired

为什么?

让我们看一下文档/代码中的一些注释:

注意,这与DataRequired有区别,因为InputRequired看起来提供了表单输入数据,DataRequired查看了后强制数据.

注意这个验证器曾经被调用,Required但它的行为方式(需要强制数据,而不是输入数据)意味着它以一种与Optional验证器不对称的方式运行,并且进一步导致与某些字段混淆,这些字段将数据强制为"假"值,如0,Decimal(0),time(0)等.除非很特殊的原因存在,我们建议使用:类:InputRequired代替.

这是什么意思?

Form课堂上你会注意到两个关键字参数formdatadata.这些通常对应两种方法processprocess_formdata.当表格数据通过线路进入时,它并不总是采用与该Field类型相对应的格式.一个很好的例子就是u'1'提供给一个人的价值IntegerField.如果你有一个NumberRange验证器,这将是一个坏消息,因为u'1'它不是一个数字.

process_formdata方法的主要目的是通过在运行验证规则之前将值强制转换为正确的类型来防止这种情况.当他们说"查看强制后数据"时,他们指的是这就是他们所说的

问题!

无论InputRequiredDataRequired相同的方式工作特别是__call__实现:

def __call__(self, form, field):
    if not field.data or isinstance(field.data, string_types) and not field.data.strip():
        if self.message is None:
            message = field.gettext('This field is required.')
        else:
            message = self.message
Run Code Online (Sandbox Code Playgroud)

某些字段类型将数据强制转换为Falsey值(0,十进制(0)等).当你有一个IntegerField和表单提交类似的值时,会出现问题'0'.如果你申请DataRequired这个,它将无法验证.这是因为DataRequiredif not field.data...在强制后评估,其中field.dataFalsey数值0.