使用Flask与SQLAlchemy时出现TypeError: Query.filter() got an unexpected keyword argument 'login'错误的排查求助
问题分析与解决
嘿,我刚排查完你的代码,触发TypeError的原因很明确——你用错了SQLAlchemy的查询方法!
错误根源
你在这一行写了:
user = User.query.filter(login=login).first()
SQLAlchemy的filter()方法不支持直接传关键字参数(比如login=login),它需要传入的是字段比较表达式,比如User.login == login。而如果想用关键字参数来匹配字段的话,应该用filter_by()方法,这个方法才是设计来接收这种键值对格式的。
两种修正方案
方案1:改用filter_by()(推荐,更简洁)
直接把filter换成filter_by就行,它会自动帮你把关键字参数映射到模型字段:
user = User.query.filter_by(login=login).first()
方案2:使用filter()加字段表达式
如果想继续用filter(),就需要明确写出字段的比较逻辑:
user = User.query.filter(User.login == login).first()
额外的小建议
除了这个错误,你的代码还有两个潜在问题,顺手帮你指出来:
- 当用户输入的login不存在时,
user会是None,这时候调用user.password会触发新的错误,建议先判断user是否存在:if user and check_password_hash(user.password, password): redirect(next_page)前面缺少return,否则这个重定向不会生效,页面还是会渲染login.html:return redirect(next_page or url_for('index')) # 可以加个默认跳转地址,避免next_page为空
修正后的完整路由代码大概是这样:
@app.route('/login', methods=['GET', 'POST']) def user_login(): login = request.form.get('login') password = request.form.get('password') if login and password: user = User.query.filter_by(login=login).first() if user and check_password_hash(user.password, password): login_user(user) next_page = request.args.get('next_page') return redirect(next_page or url_for('index')) else: flash("Login or password is incorrect") else: flash("Please fill login and password fields") return render_template('login.html')
内容的提问来源于stack exchange,提问作者Vitalii Mytenko
相关产品推荐
相关产品推荐

