ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
>[info] 本练习,是根据前面学习的知识而设置,请独立完成功能。如果你还无法独立完成以下练习,则证明还没有掌握前面的章节,好好回顾一下吧。 ## 题目要求: >[success] >1. 让用户输入账号与密码 >2. 如果账号密码匹配(用户名:Milton,密码:123456),则提示欢迎信息,退出程序 >3. 如果账号不存在,则提示账号不存在,重新回到步骤1 >4. 如果密码不匹配,则提示密码有误,重新回到步骤1 >5. 密码连续错误3次以上,提示账号已被锁定,重新回到步骤1 > >附加要求: >1. 用户信息保存在json文件中 >2. 密码md5加密保存 >3. 账号锁定时间为2分钟 >4. 充分使用函数编程 > ## 规则 * 请独立完成实战要求,完成后再参考下面的示例代码 * 如果觉得自己的代码<span style="color:red">*更加优雅,更加高效*</span>,欢迎留言**,与大家一起**分享**哦~ :-: <span style="color:green;font-size:30;">一起来挑战吧~</span> <br> ## 参考代码 用户数据文件 user.txt 内容如下:(pwd的值为md5(“123456”)) ```cmd { "Milton": { "pwd": "e10adc3949ba59abbe56e057f20f883e", "errors": 1, "lock_time": 0.0 }, "Cherish": { "pwd": "e10adc3949ba59abbe56e057f20f883e", "errors": 0, "lock_time": 0.0 } } ``` python代码如下: ```python #!/usr/bin/python # coding=utf-8 import json import time import hashlib def load_user(path="user.txt"): """ 载入用户数据 :param path: :return: """ with open(path, "r") as read_file: user_items = json.load(read_file) return user_items def auth(name,pwd,lock_time=120): """ 用户鉴权 :param name: :param pwd: :param lock_time: :return: """ user_items=load_user() if name in user_items.keys(): # 用户名匹配 user_obj=user_items.get(name) errors = int(user_obj.get("errors")) last_time = float(user_obj.get("lock_time")) r_pwd=user_obj.get("pwd") # 对登录时输入的密码进行md5加密 md5 = hashlib.md5() md5.update(pwd.encode()) pwd = md5.hexdigest() if pwd == r_pwd: # 密码匹配 if time.time() - last_time > lock_time or errors < 3: print("Dear [%s],welcome~" % name) modify_user(name, "clear_error") return True else: print("您账号已被锁定,请等候 [%f]s 后重试!" % (lock_time - (time.time() - last_time))) else: # 密码不匹配 if errors+1 < 3: # 错误次数小于3:提示登录失败,添加登录错误次数 print("您的密码不正确,未被锁定,请重新输入!") modify_user(name, "add_error") elif errors+1==3: # 在本次失败之前,已存在2次失败 print("您已经连续3次登录失败,账号已被锁定,请重新输入!") modify_user(name, "add_error") elif time.time() - last_time > lock_time: # 已锁定状态,并且限制时间已过期:重新计算错误次数 print("您的密码不正确,账号已被锁定,请重新输入!") modify_user(name, "clear_error") modify_user(name, "add_error") else: # 已锁定状态,处于限制时间之内:提示已锁定 print("您的密码不正确,账号已被锁定,请等候 [%f]s 后重试!" % (lock_time - (time.time() - last_time))) else: # 用户名不匹配 print("您的用户名未存在!") def modify_user(name, mode="add_error"): """ 修改用户名单中的登录错误次数 :param name: 用户名称 :param mode:add_error,登录错误次数自增1;clear_error,登录错误次数重置为0 :return: """ # 载入用户数据 user_items = load_user() user_obj = user_items.get(name) if user_obj: if mode=="clear_error": # 清空错误次数与锁定时间 user_obj["errors"]=0 user_obj["lock_time"]=0.0 else: # 错误次数自增1,如果错误次数==3时,添加锁定时间 errors = int(user_obj.get("errors"))+1 user_obj["errors"]=errors if errors==3: user_obj["lock_time"] = float(time.time()) # print(user_items) # 将用户数据(json格式化格式)重新写入txt文件 with open("user.txt", "w") as fp: json.dump(user_items,fp,ensure_ascii=False,indent=4) def login(): """ 登录 :return: """ while True: user_name = input("Name:") pwd = input("PASS:") if auth(user_name, pwd, 120): break if __name__ == '__main__': login() ``` ### 参考流程图 ![](https://box.kancloud.cn/a03f4d080a262f55d8c1f6a214e21136_1024x1127.jpg) <hr style="margin-top:100px"> :-: ![](https://box.kancloud.cn/2ff0bc02ec938fef8b6dd7b7f16ee11d_258x258.jpg) ***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***