我在这里问了一个关于sqlite3错误的问题。”这句话的意思是:“在[r[0] for r in list]中有var。但是,这不适用于其他目的,如检查密码哈希。由于密码哈希值不总是相同的,因此我需要使用werkzeug中的to check_password_hash()函数。要做到这一点,我需要转换成明文,因为它不会让我分裂它<sqlite3.Row object at 0x0000019393a725f0>。有人知道怎么做吗?
这是我的代码,如果你好奇的话(不工作-第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')
我尝试在[r[0]中使用var for r in list],但由于哈希值总是不同的,这不起作用。它也不允许我使用check_password_hash(password,db_password),因为“AttributeError:'sqlite3.Row'对象没有属性'split'。”我尝试将变量发送到html页面,但它显示为sqlite.Row对象,而不是实际数据。
1条答案
按热度按时间wribegjk1#
当您从数据库中获取单个项时,
fetchone()
返回一个Tuple如果您在该行后面输入
print(db_password)
,您将看到如下内容:密码散列是个废话。您需要更改下一行以使用元组的第一个元素: