我正在尝试编写一个登录模块,该模块在.csv文件中搜索输入的用户名。如果找到用户名,它将采用输入的密码,并将其通过一个函数进行验证(该密码先保存并散列,然后再保存到.csv文件中。)
我运行了以下代码,以测试列表中的用户名和正确的密码,列表中未包含的用户名,列表中的用户名和错误的密码的预期结果。
with open('userDB.csv', 'rt') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
for field in row:
if user == row[0]:
psChk = row[1]
if verify_password(psChk, password):
print('In')
else:
print('Out!!')
else:
print('Out!!')
sys.exit()
对于在列表中具有用户名和正确密码的测试,我得到两次打印“ In”语句,而当在列表中为用户进行测试并且密码不正确时,我得到了两次“输出”提示。虽然这是理想的结果,但我只想了解这里发生的情况。
当我测试用户名不在列表中时,“输出”仅打印一次。
def verify_password(stored_password,provided_password):
"""Verify a stored password against one provided by user"""
salt = stored_password[:64]
stored_password = stored_password[64:]
pwdhash = hashlib.pbkdf2_hmac('sha512',provided_password.encode('utf-8'),salt.encode('ascii'),100000)
pwdhash = binascii.hexlify(pwdhash).decode('ascii')
return pwdhash == stored_password
答案 0 :(得分:1)
错误是这一行
for field in row:
您正在检查每一行中每个字段的用户名和密码。由于每行中都有两个字段(“用户名”和“密码”),因此它执行两次。
解决方法是:
with open('userDB.csv', 'rt') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
if user == row[0]:
psChk = row[1]
if verify_password(psChk, password):
print('In')
else:
print('Out!!')
else:
print('Out!!')
sys.exit()