要求:編寫登陸接口
輸入用戶名密碼
認證成功后顯示歡迎信息
輸錯三次后鎖定
針對此實例寫了有二種類型的腳本,略有不同,具體如下:
帳號文件account.txt內容如下:
sam 123
david 12
kevin 123
lin 12
tailen 123
jack 12
鎖文件account_lock.txt默認為空
一、只針對帳號文件里的用戶進行判斷并鎖定,針對用戶和密碼各有三次錯誤重試機會。
1、流程圖如下:
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#!/usr/bin/python27 #_*_ coding:utf-8 _*_ import sys,os,getpass os.system( 'clear' ) i = 0 while i < 3 : #只要用戶登錄異常不超過3次就不斷循環 name = raw_input ( "請輸入用戶名:" ) lock_file = open ( 'account_lock.txt' , 'r+' ) #當用戶輸入用戶名后,打開LOCK 文件 以檢查是否此用戶已經LOCK了 lock_list = lock_file.readlines() for lock_line in lock_list: #循環LOCK文件 lock_line = lock_line.strip( '\n' ) #去掉換行符 if name = = lock_line: #如果LOCK了就直接退出 sys.exit( '用戶 %s 已經被鎖定,退出' % name) user_file = open ( 'account.txt' , 'r' ) #打開帳號文件 user_list = user_file.readlines() for user_line in user_list: #對帳號文件進行遍歷 (user,password) = user_line.strip( '\n' ).split() #分別獲取帳號和密碼信息 if name = = user: #如用戶名正常匹配 j = 0 while j < 3 : #只要用戶密碼異常不超過3次就不斷循環 passwd = getpass.getpass( '請輸入密碼:' ) #輸入隱藏密碼 if passwd = = password: #密碼正確,提示歡迎登錄 print ( '歡迎登錄管理平臺,用戶%s' % name) sys.exit( 0 ) #正常退出 else : print ( '用戶 %s 密碼錯誤,請重新輸入,還有 %d 次機會' % (name, 2 - j)) j + = 1 #密碼輸入錯誤后,循環值增加1 else : lock_file.write(name + '\n' ) #密碼輸入三次錯誤后,將該用戶追加到LOCK文件 sys.exit( '用戶 %s 達到最大登錄次數,將被鎖定并退出' % name) else : pass #當用戶沒匹配時,跳過并繼續循環 else : print ( '用戶 %s 不存在,請重新輸入,還有 %d 次機會' % (name, 2 - i)) i + = 1 #當用戶輸入錯誤時,循環值增加1 else : sys.exit( '用戶 %s 不存在,退出' % name) #用戶輸入三次錯誤后,異常退出 lock_file.close() #關閉LOCK文件 user_file.close() #關閉帳號文件 |
二、針對帳號文件里的不存在的用戶也可以進行判斷并鎖定,針對用戶和密碼共有三次錯誤重試機會
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#_*_ coding:utf-8 _*_ import sys,os,getpass os.system( 'clear' ) retry_limit = 3 retry_count = 0 account_file = 'account.txt' lock_file = 'account_lock.txt' while retry_count < retry_limit: #只要重試不超過3次就不斷循環 username = raw_input ( '\033[31;43mUsername:\033[0m' ) username = username.strip() lock_check = open (lock_file) #當用戶輸入用戶名后,打開LOCK 文件 以檢查是否此用戶已經LOCK了 for line in lock_check.readlines(): #循環LOCK文件 if username = = line.strip( '\n' ): #去掉換行符 sys.exit( '\033[35mUser %s is locked!!!\033[0m' % username) #如果LOCK了就直接退出 password = raw_input ( '\033[32;41mPassword:\033[0m' ) #輸入密碼 f = open (account_file, 'r' ) #打開帳號文件 match_flag = False # 默認為Flase,如果用戶match 上了,就設置為 True for line in f.readlines(): user,passwd = line.strip( '\n' ).split() #去掉每行多余的\n并把這一行按空格分成兩列,分別賦值為user,passwd兩個變量 if username = = user and password = = passwd: #判斷用戶名和密碼是否都相等 print ( 'hello, %s !!' % username) match_flag = True #相等就把循環外的match_flag變量改為了True break #然后就不用繼續循環了,直接 跳出,因為已經match上了 f.close() if match_flag = = False : #如果match_flag還為False,代表上面的循環中跟本就沒有match上用戶名和密碼,所以需要繼續循環 print ( 'sorry,%s is unmatched' % username) retry_count + = 1 #計數器加1 else : print ( 'wlecome login my learning system!' ) break #用戶成功登錄,退出腳本 else : print ( "you account %s is locked!!!" % username) g = open (lock_file, 'a' ) g.write(username) #被鎖用戶追加到用戶鎖文件 g.write( '\n' ) g.close() |