一个打印语句输出两次

布兰登·波金(Brandon Boykin)

我正在尝试编写一个登录模块,该模块在.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()

对于使用列表中的用户和正确的密码进行的测试,我会得到两次“输入”语句,而当我使用列表中的用户进行测试并使用了错误的密码时,则会两次显示“出局”。虽然这是理想的结果,但我只想了解这里发生的情况。

当我测试用户名不在列表中时,“输出”仅打印一次。

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
杰基

错误是这一行 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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章