Flask Admin授权实现报错:validate_on_submit()获多个extra_validators参数
问题解决:validate_on_submit() got multiple values for argument 'extra_validators'
直接错误原因
你调用form.validate_on_submit(form)时多传了form参数,validate_on_submit()是表单实例的方法,不需要传入实例本身作为参数。该方法的定义中,第一个参数是self(由Python自动传入),手动传入form会被当作第二个位置参数,而方法的第二个参数是extra_validators(关键字参数),这就导致了参数冲突,触发报错。
修正后的核心代码
1. 修正validate_on_submit调用
将:
if form.validate_on_submit(form):
改为:
if form.validate_on_submit():
2. 修正登录逻辑的其他问题
代码里还有几处逻辑错误,一起修正:
- 表单定义的是
email字段,但原代码先通过username查询,会导致form.username.data报错 - 验证失败后没有终止流程,会继续执行
login_user,可能传入None引发新错误 - 重复查询用户的逻辑冗余
修正后的login_page方法:
@expose('/login', methods=('GET', 'POST')) def login_page(self): if current_user.is_authenticated: return redirect(url_for('.index')) form = LoginForm() if form.validate_on_submit(): # 表单里是email字段,直接用email查询用户 user = User.query.filter_by(email=form.email.data).first() app.logger.info('user = ', user) if user is None or not verify_hash(form.password.data, user.password): flash('Invalid username or password') # 验证失败后返回登录页,避免执行后续代码 return render_template( 'security/login_user.html', title='Sign In', login_user_form=form ) login_user(user, remember=form.remember.data) next_page = request.args.get('next') if not next_page or url_parse(next_page).netloc != '': next_page = url_for('admin.index_view') return redirect(next_page) return render_template( 'security/login_user.html', title='Sign In', login_user_form=form )
3. 表单定义确认
你的LoginForm里没有username字段,保持当前定义即可(如果你的User模型用email作为登录标识):
class LoginForm(FlaskForm): password = PasswordField('Password', validators=[DataRequired()]) email = EmailField('E-mail', validators=[DataRequired()]) remember = BooleanField('Remember Me') next = TextAreaField('next') submit = SubmitField('Sign In')
关键注意点
- Flask-WTF的
validate_on_submit()方法不需要传入任何参数,它会自动结合当前请求的POST数据完成验证 - 确保表单字段名与代码中使用的字段名一致,避免出现
AttributeError - 验证失败后必须通过
return终止当前流程,防止后续代码执行引发异常
内容的提问来源于stack exchange,提问作者Konstantinos
相关产品推荐
相关产品推荐

