【问题标题】:Flask forms, custom validation errors/functions烧瓶表单,自定义验证错误/功能
【发布时间】:2020-06-13 08:01:38
【问题描述】:

我的表单中有一个 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 以便它显示在我的密码字段下,我会很高兴知道。

【问题讨论】:

  • 您没有显示任何WTForm。您可以使用 .errors 属性访问它们,但您的问题中没有足够的信息来帮助您解决此问题
  • 好的,添加了整个表格,还有什么我应该提供的吗?那么 .errors 是空的,因为登录函数不是特定于字段的,我应该将该函数拆分为 validate_password() 函数吗?
  • 为什么在表单中验证密码而不在用户模型中验证?
  • 如果我要在模型中验证它,那么我不能返回任何会出现在该字段下的错误
  • 为什么要告诉用户邮箱是否存在或者密码不正确。在安全性方面,这并不合理。使用 Flash 消息替代表单字段下的错误消息。

标签: python flask wtforms


【解决方案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 列表。

确保您不告诉用户哪个表单字段包含错误,并且用户可能更容易猜出访问数据。

【讨论】:

  • 好的,我想我会做这样的事情,谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 2021-05-20
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多