烧瓶形式,自定义验证错误/功能

时间:2020-06-13 08:01:38

标签: python flask wtforms

我的表单中有一个login()函数,我想在其中的特定字段上返回错误,我的问题是,我该怎么做,这是我当前的函数:

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

    def validate_email(self, email):
        user = models.User.query.filter_by(email=email.data).first()

        if user is None:
            raise ValidationError('Such user not found')

    def login(self, user):
        if check_password_hash(user.password, self.password.data):

            flash('Logged in successfully!', category='success')

            login_user(user, remember=self.remember.data)

            return True

        else:
            raise LoginException('Wrong Password')


我应该只显示错误还是应该将其重新制成单独的验证密码功能?例如,如果有一种方法可以返回LoginException,以便将其显示在我的密码字段下,我将很高兴知道。

1 个答案:

答案 0 :(得分:1)

我想我已经为您找到了解决方案。那是你想要的吗?

def valid_credentials(form, field):
    user = User.query.filter_by(email=form.email.data).first()
    return user and user.verify_password(form.password.data)


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

    def validate_email(self, field):
        if not valid_credentials(self, field):
            raise ValidationError('Invalid user credentials.')

    def validate_password(self, field):
        if not valid_credentials(self, field):
            raise ValidationError('Invalid user credentials.')

class User(db.Model):
    email = db.Column(db.String,
        nullable=False, unique=True, index=True)
    password_hash = db.Column(db.String,
        nullable=False, unique=False, index=False)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

您还可以将valid_credentials (form, field)移到表单中和/或仅将一个验证功能传递给validators列表。

请确保您不告诉用户哪个表单字段包含错误,并且用户可以更轻松地猜测访问数据。