如何将sqlite3.Row对象转换为明文以验证密码哈希?
SQLite3 Row对象无法传入Werkzeug check_password_hash()函数报错
之前解决过sqlite3返回<sqlite3.Row object at 0x0000019494a725f0>而非实际数据的问题,当时用var in [r[0] for r in list]的方式提取值,但这个方法在密码哈希验证场景不适用——因为密码哈希不是固定值,必须用Werkzeug的check_password_hash()函数来验证。
现在遇到的问题是,sqlite3.Row对象直接传入check_password_hash()会报错:AttributeError: 'sqlite3.Row' object has no attribute 'split',就算把变量传递到HTML页面,显示的依然是Row对象而非实际的哈希值。
以下是我的代码(第14行存在问题):
@app.route('/login', methods=["GET", "POST"]) def login(): db = get_db() if current_user.is_authenticated: return redirect('/home') else: if request.method == "POST": id = request.form["id"] email = request.form["email"] db_id = db.execute('SELECT UserID FROM Users WHERE Email = \"%s\"' % email).fetchall() if int(id) in [r[0] for r in db_id]: password = request.form["password"] db_password = db.execute('SELECT Password FROM Users WHERE Email = \"%s\"' % email).fetchone() check = check_password_hash(db_password, password) # 问题所在行 if check == 'True': user = User(id, email) login_user(user) return render_template('Home.html', title='Home Page') else: return render_template('Exist.html', title='Login Page') else: return render_template('Exist.html', title='Login Page')
我试过用var in [r[0] for r in list]的方式提取值,但由于哈希值需要通过专门的验证函数处理,这个方法在这里无法直接解决问题。
内容的提问来源于stack exchange,提问作者Benjamin
相关产品推荐
相关产品推荐

