Python Flask登录代码提交未注册账号报NoneType无len()错误
报错根因
当提交的邮箱未录入数据库时,curl.fetchone() 执行后没有匹配的查询结果,会返回None而非空集合。原代码直接对可能为None的user变量调用len()方法,就会触发该类型错误。
修复方法
将原有长度判断逻辑替换为非空判断即可,修改后的代码片段如下:
def login(): if request.method == 'POST': email = request.form['email'] password = request.form['password'].encode('utf-8') curl = mysql.connection.cursor(MySQLdb.cursors.DictCursor) curl.execute("SELECT * FROM users WHERE email=%s",(email,)) user = curl.fetchone() curl.close() # 替换原有len(user) > 0的判断逻辑 if user: if bcrypt.hashpw(password, user["password"].encode('utf-8')) == user["password"].encode('utf-8'): session['name'] = user['name'] session['email'] = user['email'] return redirect(url_for('home')) else: flash ("Error password and email not match") return redirect(url_for('login')) else: flash("Error user not found") return redirect(url_for('login')) else: return render_template("login.html")
额外优化建议
- 可以使用
with上下文管理器操作游标,避免忘记手动关闭游标造成的资源泄漏 - 密码校验可以直接使用
bcrypt.checkpw(password, user["password"].encode('utf-8'))方法,代码可读性更高
内容的提问来源于stack exchange,提问作者Ardian
相关产品推荐
相关产品推荐

