一个print语句输出twi

2024-04-26 12:06:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个登录模块,在.csv文件中搜索输入的用户名。如果它找到用户名,它将获取输入的密码并通过一个函数对其进行验证(密码在保存到.csv文件之前是经过salt和hash处理的)。你知道吗

我运行了下面的代码,对列表中的用户名和正确的密码、不在列表中的用户名、列表中的用户名和错误的密码进行了测试。你知道吗

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”语句,当我使用列表中的用户和错误的密码进行测试时,我会打印两次“Out”。虽然这是期望的结果,但我只想了解这里发生了什么。你知道吗

当我测试用户名不在列表中时,“Out”只打印一次。你知道吗

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

Tags: 文件csvin密码列表passwordout用户名
1条回答
网友
1楼 · 发布于 2024-04-26 12:06:41

错误就在这条线上 for field in row:

您正在检查每行中每个字段的用户名和密码。因为每行有两个字段(“username”和“password”),所以它执行两次。你知道吗

解决方法是:

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()

相关问题 更多 >