wtforms Flask 中的验证器 Python

Validators in wtforms Flask Python

我尝试在我的注册页面中将数字范围添加到密码中,以确保我的密码列中至少有一个数字,当我删除数字范围时,它工作正常,但如果我再次添加它, 它会抛出一个错误

从 flask_wtf 导入 FlaskForm 从 wtforms 导入 StringField、PasswordField、SubmitField、BooleanField from wtforms.validators import DataRequired, length, Email, EqualTo, NumberRange

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired(),
                            length(min=2, max=20)] )
    email = StringField('Email', validators=[DataRequired(),
                            Email(message="Please input a valid email address")])
    password = PasswordField('Password', validators=[DataRequired(),
                                length(min=5, max=12), NumberRange(min=1, max=3)])
    confirm_password = PasswordField('Confirm_Password',
                                    validators=[DataRequired(),
                                    EqualTo('password', message="Your password does not match")] )
    submit = SubmitField('SignUp')

class LoginForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(),
                            Email()])
    password = PasswordField('Password', validators=[DataRequired() ])
    remember = BooleanField('Remember me')

    submit = SubmitField('Login')

这是我尝试添加数字范围时的错误

TypeError
TypeError: must be real number, not str

问题是 NumberRange() 只接受数字类型(整数、浮点数、双精度等),但在传递字符串时总是会失败。这就是您的错误消息告诉您的内容,“输入必须是实数,而不是字符串”。

解决方法:使用Regexp()

Regexp() 将允许您将用户的输入与正则表达式进行比较。您可以根据需要将其设置得尽可能复杂,但要解决您当前对“至少一位数”的要求,以下应该可行: Regexp('/d')

最后一个音符。我注意到您使用的是 DataRequired(),WTForms 文档建议改用 InputRequired(),除非在我看不到的特定用例中适用。

参考文献:https://wtforms.readthedocs.io/en/2.3.x/validators/