疑问-Python程序(注册登录程序)

问题写在代码第一行(第一段代码后有更新),懂的程序员能看一下吗(有点费眼)?

#修复bug:加入黑名单的用户名仍能执行登录程序【代码登录流程部分(66-101行)】
def inital_page():
    print("*"*30)
    print("编码\t操作")
    print("1\t注册")
    print("2\t登录")
    print("3\t退出")
    print("*"*30)
     
def register_page():
    print("注册".center(30,'-'))
    print("提示:用户名只能包含数字、字母以及'_'")
    #用户名注册
    while True:
        out = 0
        username = input("请输入用户名:")
            #判断用户名是否存在
        f = open("userlist.txt","a+",encoding="utf-8") #如有非数字以及文字字符,一定要加encoding = "……",否则将默认以编码解码,导致报错
        f.seek(0)
        data = f.readlines()
        for user in data:
            if username == user.split(":")[0]:
                print("用户名已存在,请重新输入") 
                out += 1                      
            else:
                continue
        #判断用户名是否符合规范
        for i in list(username):
            if i.isalnum() or i == "_":
                continue
            else:
                print("【用户名只能为字母、下划线和数字!】")
                out = out + 1
                break

        #退出该流程
        if out == 0:
            break
        
    #密码注册
    while True:
        out = 0
        password = input("请输入密码:")
        if not(password.isalnum() and len(password) <= 8):
            print("【密码只能为数字、字母以及8个字符】")
            out = out + 1
            
            
        else:
            password2 = input("请再次输入密码:")
            if password2 != password:
                print("两次密码不一致")
                out += 1
                continue  
            else:
                print("注册成功!")
                break
        if out == 0:
            break
       
    #储存用户名和密码到文件中
    f = open("userlist.txt","a+",encoding='utf-8')
    f.write(f"{username}:{password}"+'\n')
    f.close()
    
#登录流程          
def login_page():
    name = []
    key = []

    print("登录".center(30,'-'))   
    g = open("blacklist.txt","a+",encoding='utf-8') 
    f = open("userlist.txt","r",encoding='utf-8')
    f.seek(0)
    word = f.readlines()
    for line in word:
        name.append(line.split(":")[0].replace("\n",""))
        key.append(line.split(":")[1].replace("\n",""))
    username1 =input("请输入您的用户名:")
    if username1 not in name:
        print("用户名不存在,请重新输入!")
    else:
        times = 3
        while True:
            password1 = input("请输入您的密码:")     
            if password1 == key[name.index(username1)]:
                        print("登陆成功")
                        break
            else:
                if times == 2:
                    times -= 1
                    print(f"密码错误,请重新输入密码,您还有{times}次机会")
                    continue
                elif times == 1:
                        print("您的账号已被锁定,请稍后重试")
                        g.write(username1 + '\n')
                        break
                else:
                    times -= 1
                    print(f"密码错误,请重新输入密码")
                               
def program_test():
    while True: 
        inital_page()
        oper_code = input("请输入您所需操作的对应编号(1、2、3):")
        if oper_code == "1":
            register_page()
        elif oper_code == "2":
            login_page()
        elif oper_code == "3":
            exit()
        else:
            print("输入错误,请重新输入!")            
program_test()

后在79行和80行之间插入了以下代码,仍然没有达到效果*,想问一下怎么修改才能达到效果呢?
效果:登录流程中,用户输入用户名后,如用户为黑名单中的用户,则提示“账户已锁定”

 forbid_users = g.readlines()
    print(forbid_users)
    for user in forbid_users:
        if username1 == user.replace("\n",""):
            print("您的账号已被锁定,请联系管理员")
            break

【以下回答由 GPT 生成】

问题分析

根据代码,目前的登录流程没有判断用户是否在黑名单中,导致黑名单用户仍能执行登录程序。为了修复这个bug,我们需要在登录前先判断用户是否在黑名单中,如果用户在黑名单中,则不允许登录。

解决方案

修复这个bug的具体步骤如下:

  1. 在登录前,先判断用户是否在黑名单中。我们可以在register_page函数外部,添加一个load_blacklist函数,用于加载黑名单信息。
  2. 修改登录流程部分的代码,在用户输入用户名后,先判断用户名是否在黑名单中。如果在黑名单中,则提示用户该用户已被禁止登录。
  3. 将修复后的代码进行测试,确保黑名单用户无法登录。

下面是修改后的代码:

# 加载黑名单信息
def load_blacklist():
    f = open("blacklist.txt", "a+", encoding="utf-8")
    f.seek(0)
    blacklist = f.readlines()
    f.close()
    return [user.strip() for user in blacklist]

def register_page():
    print("注册".center(30, '-'))
    print("提示: 用户名只能包含数字、字母以及下划线")

    # 加载黑名单信息
    blacklist = load_blacklist()

    # 用户名注册
    while True:
        out = 0
        username = input("请输入用户名:")

        # 判断用户名是否在黑名单中
        if username in blacklist:
            print("该用户已被禁止登录")
            continue

        # 判断用户名是否存在
        f = open("userlist.txt", "a+", encoding="utf-8")
        f.seek(0)
        data = f.readlines()
        for user in data:
            if username == user.split(":")[0]:
                print("用户名已存在,请重新输入")
                out += 1                      
            else:
                continue

        # 判断用户名是否符合规范
        for i in list(username):
            if i.isalnum() or i == "_":
                continue
            else:
                print("【用户名只能为字母、下划线和数字!】")
                out += 1
                break

        # 退出该流程
        if out == 0:
            break

    # 其他注册流程...

修复后的代码中,我们添加了一个load_blacklist函数来加载黑名单信息,使用列表blacklist保存黑名单中的用户名。在用户名注册部分的代码中,先判断用户输入的用户名是否在黑名单中,如果在,则提示用户该用户已被禁止登录,并重新进入用户名的输入环节。

请注意,这里假设黑名单的用户名信息存储在一个名为blacklist.txt的文件中,每行一个用户名。

测试

为了测试修复后的代码,我们可以按照以下步骤进行操作:

  1. 创建一个名为blacklist.txt的文本文件,并在其中添加一些黑名单的用户名,每行一个用户名。
  2. 运行修复后的代码,验证在登录时输入黑名单中的用户名是否会被禁止登录。

如果在登录时输入黑名单中的用户名,应该会得到一个提示,说明已被禁止登录。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

應該先判斷是否 黑名單,才檢查密碼是否正確。