python登陆认证作业实现
作业题目: 编写登陆认证程序
作业需求:
基础需求:
让用户输入用户名密码
认证成功后显示欢迎信息
输错三次后退出程序
升级需求:
可以支持多个用户登录 (提示,通过列表存多个账户信息)
用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里)
需求分析:
1、账号锁定状态保存,需要使用文件操作。 2、功能实现分解: > 验证用户输入名是否存在 > 用户存在且未锁定,则开始验证密码 > 3次登录机会内,密码匹配正确则登录成功 > 登录次数超限则禁用改账户,并保存账号状态
功能实现:
一、新建文件 userList 用来保存用户表,格式如下:
采用python内置数据类型 列表 的格式进行保存,单个用户信息为 字典 格式,通过文件读取出字符串,使用 eval() 方法转换为 列表 ,方便代码操作。
1 [ 2 { 3 'username': 'user1', 4 'password': 'password1', 5 'status': 0 6 }, 7 { 8 'username': 'user2', 9 'password': 'password2', 10 'status': 0 11 }, 12 { 13 'username': 'user3', 14 'password': 'password3', 15 'status': 1 16 } 17 ]
二、新建文件 code.py ,编写初始化代码
1 #初始化一个全局变量为空列表,用以保存用户列表数据 2 userList = [] 3 4 #定义初始化方法,从文件中获取用户列表数据 5 def init() : 6 global userList 7 f = open("userList", "r") 8 userList_str = f.read() 9 f.close() 10 userList = eval(userList_str) 11 12 #调用初始化方法 13 init()
三、登录方法
1 ''' 2 验证用户名是否存在 3 存在则返回用户在用户列表中的索引值 4 不存在则返回-1,表示不存在 5 单独封装,方便调用 6 ''' 7 def getUserInfo(username) : 8 for index, item in enumerate(userList): 9 if item['username'] == username : 10 return index 11 else : 12 return -1 13 14 ''' 15 登录方法 16 循环调用input()方法 17 根据用户输入匹配用户名 18 匹配成功则跳出循环,开始校验密码 19 ''' 20 def login() : 21 global userList 22 while True: 23 username = input('请输入用户名:') 24 uid = getUserInfo(username) 25 if uid >= 0 : 26 #用户status=0时为正常,status=1时为禁用 27 if userList[uid]['status'] == 0 : 28 checkPassword(uid) 29 break 30 else: 31 print('该账号已被禁用,请重新输入!') 32 else: 33 print('用户不存在,请重新输入!')
四、密码校验
1 def checkPassword(uid) : 2 global userList 3 count = 1 4 while count < 4: 5 password = input('请输入密码:') 6 if userList[uid]['password'] == password: 7 print('你好,%s ,登陆成功'%(userList[uid]['username'])) 8 break 9 else: 10 count = count + 1 11 if count == 4 : 12 editUser(uid, 'status', 1)#设置当前尝试登陆账号的status值为1(禁用) 13 print('密码不正确,超出登陆次数限制,该账号被禁用!') 14 else : 15 print('密码不正确,请重新重输入,还有 %d 次输入机会!' %(4-count))
五、修改用户信息
1 #修改用户列表数据 2 def editUser( uid, key, val ): 3 global userList 4 userList[uid][key]=val 5 f = open("userList", "w") 6 f.write(str(userList)) 7 f.close()
至此任务完成,完整代码如下:
1 #初始化一个全局变量为空列表,用以保存用户列表数据 2 userList = [] 3 4 #定义初始化方法,从文件中获取用户列表数据 5 def init() : 6 global userList 7 f = open("userList", "r") 8 userList_str = f.read() 9 f.close() 10 userList = eval(userList_str) 11 12 #修改用户列表数据 13 def editUser( uid, key, val ): 14 global userList 15 userList[uid][key]=val 16 f = open("userList", "w") 17 f.write(str(userList)) 18 f.close() 19 20 #验证用户名是否存在,存在则返回用户信息 21 def getUserInfo(username) : 22 for index, item in enumerate(userList): 23 if item['username'] == username : 24 return index 25 else : 26 return -1 27 28 def login() : 29 global userList 30 while True: 31 username = input('请输入用户名:') 32 uid = getUserInfo(username) 33 if uid >= 0 : 34 if userList[uid]['status'] == 0 :#用户status=0时为正常,status=1时为禁用 35 checkPassword(uid) 36 break 37 else: 38 print('该账号已被禁用,请重新输入!') 39 else: 40 print('用户不存在,请重新输入!') 41 42 def checkPassword(uid) : 43 global userList 44 count = 1 45 while count < 4: 46 password = input('请输入密码:') 47 if userList[uid]['password'] == password: 48 print('你好,%s ,登陆成功'%(userList[uid]['username'])) 49 break 50 else: 51 count = count + 1 52 if count == 4 : 53 editUser(uid, 'status', 1)#设置当前尝试登陆账号的status值为1(禁用) 54 print('密码不正确,超出登陆次数限制,该账号被禁用!') 55 else : 56 print('密码不正确,请重新重输入,还有 %d 次输入机会!' %(4-count)) 57 58 #调用初始化方法 59 init() 60 #开始登陆 61 login()
功能实现使用到的知识点:
1、文件读写操作
2、python函数创建、传参、返回值
3、变量作用域
4、 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
5、while循环、终止循环
6、数据类型:字符串、列表、整型、字典
7、执行字符串表达式: eval()
8、其它数据类型转为字符串: str()