码迷,mamicode.com
首页 > 其他好文 > 详细

day1作业:编写登录窗口一个文件实现

时间:2017-06-03 21:49:31      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:username   lin   obj   信息   ext   错误   lex   file   alt   

    思路:

    1、参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则;

      1)认证流程参考的是Linux的登录:当你输入完用户名密码后再验证用户名是否存在用户是否被锁定,然后在验证密码是否正确,如果验证不过去只会告诉你验证失败,而不告诉你到底是用户名错误还是密码错误,增加了暴力破解的难度;

      2)关于输入错误次数的计数和锁定,我参考的是银行和支付宝的做法,也就是只关心你输错了多少次,不关心输对了多少次,也就是说输错了两次,第三次输对了,前面的计数不清零,也就是你今天输入了1000次输对了997次,只输错了3次,那对不起,依然要锁定。而且输入错误的3次不一定要连续。只要三次输入错误三次就锁定。

    2、关于计数和状态的保存我考虑还是通过文件来持久化保存,每次输入错误次数的累加和锁定都保存到文件中,这样虽然增加了文件的操作,但是保证了程序的可靠性,这样程序退出,计数依然有效。文件类型如下:

    alex sb lock 3
  tom 666 unlock 0
  geng 888 unlock 2

    其中第一列是用户名,第二列是密码,第三列是用户状态(lock代表锁定,unlock代表没有锁定),第四列是登录次数(其实,登录次数只要错误的时候登录次数加一即可,没有错误的时候不用管它)。

技术分享

代码如下:

 1 def write_file(messages,filename):
 2     """向文件中添加信息,一行一行添加信息,打开文件使用‘w‘格式要注意"""
 3     with open(filename,"w") as f:
 4         for key,values in messages.items():
 5             """
 6             lines = []
 7             print(key,value)
 8             lines.append(key)
 9             lines.extend(value)     #把一个列表的信息添加到另一个列表中
10             print("lines",lines)
11             f.write(" ".join(lines) + "\n")
12             """
13             values.insert(0,key)              #由于字典的值是列表,可以直接向列表中插入元素
14             f.write(" ".join(values) + "\n")  #字符串拼接,字符串与列表拼接
15 
16 # messages = {"alex":["sb","lock","3222"],"tom":["666","unlock","0222"],"geng":["888","unlock","2222"]}
17 # write_file(messages,"account.db")
18 
19 if __name__ == "__main__":
20     active = True
21     #程序执行的标识符,可以通过标识符来执行程序
22     while active:
23         username = input("请输入你的用户名(输入quit退出):")
24         users_dict = {}     #用户字典,用于存放用户的信息,键-用户名,值-列表对应的密码,状态,次数
25         with open("account.db","r") as obj_f:     #打开文件,读取文件信息
26             lines = obj_f.readlines()             #按行读取文件,读取到一个列表中
27             for line in lines:
28                 user_list = line.strip().split()
29                 users_dict[user_list[0]] = user_list[1:]  #把用户信息存放在一个字典中,字典的值是一个列表
30 
31         if username in users_dict.keys():
32             if users_dict[username][1] == "lock":
33                 print("您输入的用户名已经锁定,请联系管理员!")
34                 exit()
35             else:
36                 while int(users_dict[username][2]) < 3:
37                     user_pwd = input("请输入密码:")
38                     if users_dict[username][0] == user_pwd:
39                         print("欢迎回来,祝你生活愉快,天天OOXX!")
40                     else:
41                         if int(users_dict[username][2]) != 2:
42                             print("还有%s次机会,用户将被锁定!" % (2 - int(users_dict[username][2])))
43                         users_dict[username][2] = int(users_dict[username][2]) + 1
44                 else:
45                     #输入次数过多,要锁定用户
46                     print("对不起,您输入的次数过多,你的用户名已经被锁定,请联系管理员!")
47                     users_dict[username][1] = "lock"
48                     users_dict[username][2] = "3"
49                     write_file(users_dict,"account.db")
50         elif username == "quit":
51             exit()
52 
53         else:
54             print("您输入的用户名不存在,请重新输入!")
运行结果如下:
请输入你的用户名(输入quit退出):tom
请输入密码:22
还有2次机会,用户将被锁定!
请输入密码:22
还有1次机会,用户将被锁定!
请输入密码:22
对不起,您输入的次数过多,你的用户名已经被锁定,请联系管理员!
请输入你的用户名(输入quit退出):alex
您输入的用户名已经锁定,请联系管理员!

    其实对文件的操作,其本质上还是对字符串列表,字典的操作,文件的操作,读取文件的方法,readlines()按行读取存放到一个列表中,使用dict(字典)记录用户信息。字符串的拼接(join)方法,(" ".join(list)),字符串与列表进行拼接,形成一个新的字符串,其实字符串的本质上在python中存储的形式就是以列表的形式存储,列表之间的拼接,list.extend(list),列表之间的拼接。

     代码说明:

    1、这里用了两个今天课程没有讲的内容:字典和函数,将用户信息以字典的方式保存是出于判断用户名是否存在的考虑,读文件的时候直接将用户名作为字典的一个key,其他的信息作为字典的value与key一一对应,这样在判断用户名是否存在只需要通过in这个成员运算符进行判断就可以了;

    2、代码的第61和62两行代码完成的就是将文件变成字典的过程。

技术分享

 

day1作业:编写登录窗口一个文件实现

标签:username   lin   obj   信息   ext   错误   lex   file   alt   

原文地址:http://www.cnblogs.com/gengcx/p/6938413.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!