对于wtforms.BooleanField,DataRequired验证程序已中断

时间:2014-05-15 14:54:46

标签: python json validation wtforms

我使用WTForms(与Flask,flask-wtf,sqlalchemy一起)来验证REST API的传入JSON。我意识到WTForms更倾向于HTML表单渲染和验证,但我选择它是因为它可以从我的sqlalchemy模型中自动生成表单(感谢wtforms.ext.sqlalchemy)。

无论如何,这是问题所在。我的一个模型包括布尔字段,它转换为带有DataRequired验证器的wtforms.BooleanField。问题是验证失败,因为这个字段是必需的'即使我传递正确的数据也会出现错误消息我的表格:

class MyForm(Form):
    name = TextField('name', validators=[DataRequired()])
    disabled = BooleanField('disabled', validators=[DataRequired()])

JSON数据是这样的:

'{"name": "John", "disabled": "false"}'

我期待的是:

  1. {"disabled": "false"} - >验证成功的强制Python数据:{'disabled': False}
  2. {"disabled": "true"} - >验证成功的强制Python数据:{'disabled': True}
  3. {"disabled": ""}'{"disabled": "foo"}' - >验证失败
  4. 目前在第一种情况下,使用{'disabled': [u'This field is required.']}

    验证失败

    我知道docs中有一条说明DataRequired验证器"需要强制数据,而不是输入数据",但1)表单由{{1}自动生成和2)如果我使用wtforms.ext.sqlalchemy验证器,它应该如何表现?检查(通过InputRequired某些数据是否存在,然后检查此数据是否为" true"或" false"?

    总结一下,我的问题是:

    1. 验证form.validate()的正确方法是什么?
    2. 也许有一些其他框架可以根据给定的sqlalchemy模型验证传入的JSON?
    3. 感谢。

1 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题。您可以编写自己的转换器以使用具有true / false选项的radiofield,您可以使用数据过滤器,您可以设置默认值,但我认为您可以使用此行为:

MyForm = model_form(MyModel, db_session=db, field_args = {
    'disabled' : {
        'false_values': ['false'],
        'validators' : [InputRequired()] }
})

编辑:如果你想要一个更严格的处理程序,你可以执行以下操作:

class BooleanRequired(object):
    field_flags = ('required', )

    def __init__(self, message=None):
        self.message = message

    def __call__(self, form, field):
        if field.data is None:
            if self.message is None:
                message = field.gettext('This field is required.')
            else:
                message = self.message

            field.errors[:] = []
            raise StopValidation(message)


class StrictBooleanField(BooleanField):
    def process_formdata(self, valuelist):
        self.data = None
        if valuelist:
            if valuelist[0] == 'false':
                self.data = False
            elif valuelist[0] == 'true':
                self.data = True


class StrictModelConverter(ModelConverter):
    @converts('Boolean')
    def conv_Boolean(self, field_args, **extra):
        return StrictBooleanField(**field_args)

MyForm = model_form(MyModel, db_session=db, converter=StrictModelConverter(),
           field_args = { 'disabled' : { 'validators': [BooleanRequired()] }
})