训练1:
模拟登陆:
1. 用户输入帐号密码进行登陆
2. 用户信息保存在文件内
3. 用户密码输入错误三次后锁定用户
login2.py:
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # author : Wang Yue
4
5 import sys,hashlib,getpass,time
6
7 #定义用户类
8 class real_user(object):
9 real_name=''#用户名
10 real_pwd=''#密码
11 login_count=0 #登录次数
12 lock_time=0 #锁定时间
13 #重写构造函数,用于初始化用户类实例
14 def __init__(self,real_name,real_pwd):
15 self.real_name=real_name
16 self.real_pwd=real_pwd
17 #属性设定方法
18 def set_lock(self,lt):
19 self.lock_time=lt
20
21 def get_login_count(self):
22 return self.login_count
23
24 #定义业务方法,用于锁定自身用户实例的方法
25 def lock_me(self,seconds):
26 self.lock_time=seconds
27 lock_info=self.real_name + "," + str(self.lock_time) + "\n"
28 return lock_info
29 #定义业务方法,用于解锁自身用户实例
30 def unlock_me(self,u_name):#lock_time float
31 if u_name == self.real_name and time.time() >= self.lock_time:
32 self.lock_time = 0
33 return True
34 else:
35 return False
36
37 #单独封装的函数,主函数中会使用到的方法,公共性的,对于主函数透明
38 #从文件(数据源)中,将已经存在的用户信息,写为字符串数组,返回该数组
39 def get_file_line(file,mode_file):
40 userlist = []
41 with open(file,mode=mode_file,encoding='utf-8') as filedb:
42 filedb.flush()
43 filedb.seek(0)
44 fileline=filedb.readline()
45 while fileline:
46 userlist.append(fileline)
47 fileline=filedb.readline()
48 return userlist
49
50 #将信息回写到文件,主函数中用于写黑名单
51 def input_line_file(file,info):#info is a list
52 with open(file,mode="a+",encoding="utf-8") as filedb:
53 for info_line in info:
54 filedb.write(info_line + "\n")
55
56 #将信息从文件中删除,含有信息的行会被删除
57 def delete_line_file(file,info):
58 with open(file,mode="w+",encoding="utf-8") as filedb:
59 filedb.flush()
60 filedb.seek(0)
61 for line_one in filedb.readlines():
62 if info in line_one:
63 line_info=line_one.split()
64 if line_info[0] == info:
65 continue
66 filedb.write(line_one)
67
68 #校验登录,参数:登录的用户名,密码,真是存在的用户实例list
69 #用户名密码,检查锁定状态
70 #返回值:登录成功,当前锁定。(用户名压根不存在的话,在主函数就过滤掉了)
71 def verify_me(u_name,u_pwd,user):
72 if user.lock_time != 0:
73 return "fuck you,fuck off"
74 if time.time()>=user.lock_time:
75 user.lock_time=0
76 if user.real_name == u_name:
77 user.login_count +=1
78 if user.real_name == u_name and user.real_pwd == u_pwd:
79 user.login_count = 0
80 user.lock_time = 0
81 return "sucess"
82 else:
83 return "retry once....."
84
85 #获得MD5,密码在文件中存放时是MD5加密的
86 def get_md5_enc(need_md5_char):
87 utf_kkk = need_md5_char.encode(encoding="utf-8")
88 m = hashlib.md5()
89 m.update(utf_kkk)
90 md5_char = m.hexdigest()
91 return md5_char
92
93 #主函数
94 if __name__ == '__main__':
95 userlist=get_file_line("user_db.doo","r") #获取用户信息,存成信息list
96 locklist=get_file_line("lock_db.doo","r") #获取黑名单信息,存成信息list
97 user=[] #定义用户实例数组
98
99 #初始化全部用户实例,使用用户类的构造函数
100 for user_line in userlist:
101 name_pwd=user_line.split("::++++::")
102 name=name_pwd[0].strip()
103 pwd=name_pwd[1].strip()
104 user.append(real_user(name,pwd))
105
106 #遍历用户实例数组,将锁定属性赋值
107 for lock_inf in locklist:
108 lock_info=lock_inf.strip()
109 if lock_info =='':
110 continue
111 lockif=lock_info.split(',')
112 for user_ok in user:
113 if user_ok.real_name==lockif[0]:
114 user_ok.set_lock(float(lockif[1].strip()))
115
116 #以下开始正式业务
117 count = 0 #用于记录登录次数
118 while True:
119 #输入用户名密码,并将密码MD5
120 print("hello let try login")
121 username=input("username:")
122 passinput=input("password:")
123 passwd = get_md5_enc(passinput)
124
125 #从用户类实例list中,确定用户行为:用户名是否正确?密码是否正确?
126 for user_one in user:
127 #用户名不正确,3次,提示需要注册,程序结束
128 if user_one.real_name !=username:
129 if count >2:
130 print("you need reg.....")
131 sys.exit(0)
132 continue
133
134 #用户名正确,密码情况:
135 check_login=verify_me(username,passwd,user_one)
136 #密码正确,登录成功
137 if check_login =="sucess":
138 print("hello:{_name},login success!!!!".format(_name=username))
139 delete_line_file("lock_db.doo",username)
140 sys.exit(0)
141 #密码不正确,该用户实例的登录次数+1,避免仅提供三次输入用户名密码就结束的情况,不然中途换了用户名,就出bug了
142 #用户名正确时,用户登录次数超过3次,将被锁定5分钟。
143 elif user_one.get_login_count() > 2 and user_one.real_name == username:
144 lock_time=time.time()+300
145 lock_info=user_one.lock_me(lock_time)
146 lockjj=[]
147 lockjj.append(lock_info)
148 input_line_file("lock_db.doo",lockjj)
149 print("fuck you,lock you 5m!!!!")
150 sys.exit(0)
151 #登录状态为锁定的话,就结束程序
152 elif check_login =="fuck you,fuck off":
153 print("fuck you,fuck off:{_name}.you were locked".format(_name=username))
154 sys.exit(0)
155 #解锁用户:锁定时间算法为(锁定发生时,增加300秒),当前时间>=锁定的时间,即可解锁
156 elif user_one.lock_time <= time.time() and user_one.real_name==username:
157 user_one.unlock_me(username)
158 delete_line_file("lock_db.doo",username)
159 continue
160 #判定用户名不正确的使用登录次数,超过3次就结束
161 elif count <2:
162 count +=1
163 break
164 count +=1
因为密码是MD5加密的,所以无法直接维护数据源文件,所以提供注册程序:\
reg.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author : Wang Yue
import hashlib,getpass,sys
#MD5加密算法
def get_md5_enc(need_md5_char):
utf_kkk = need_md5_char.encode(encoding="utf-8")
m = hashlib.md5()
m.update(utf_kkk)
md5_char = m.hexdigest()
return md5_char
print("input username,and passwd")
#以两种方式打开文件的流,增加模式,只读模式
user_db=open("user_db.doo",mode="a+",encoding="utf-8")
check_db=open("user_db.doo",mode="r",encoding="utf-8")
#主业务程序:
while True:
#获取输入的用户名,密码
username = input("username:")
passwd = getpass.getpass("password:")
passwd2 = getpass.getpass("password confirmation:")
#判断确认密码是否一致。
if passwd == passwd2:
cc_status=0
check_line=check_db.readline()
while check_line: #在密码文件中,检查是否已经存在了需要添加的用户名
cl=check_line.split("::++++::")
if cl[0] == username:
print("repetition username !!! add user faild,username:{_username}".format(_username=username))
cc_status=1
check_line=check_db.readline()
if cc_status == 1: #确定是否要退出程序
quit_con = input("quit me (y/n):::")
if quit_con == "y":
user_db.close()
check_db.close()
sys.exit()
else:
continue
#如果能走到这一步,说明,就是要添加一个用户了
en_pass = get_md5_enc(passwd) #MD5密码。
var_char = username + "::++++::" + en_pass + "\n" #设定好约定的用户名密码之间的分隔,及回行符
user_db.write(var_char) #写入用户数据文件
print("succed username:{_username}".format(_username=username))
else:
print("The input is inconsistent(password)")
quit_con = input("quit me (y/n):::")
if quit_con == "y":
user_db.close()
check_db.close()
sys.exit(0)
以下提供数据源文件样例:
user_db.doo:
wangyue::++++::1aa7657007cd60caf3e90a3d4abc8e1b
renchunlin::++++::af2e8cbcc3b08e63a6782b65565848e7
laopeng::++++::9ef3a32fdefa9fe7e9e2edfeaa65fd6f
guohui::++++::cfb599bba2e35793a620de1ecec0d09a