要求:編寫登陸介面
輸入使用者名稱密碼
認證成功後顯示歡迎資訊
輸錯三次後鎖定
針對此執行個體寫了有二種類型的指令碼,略有不同,具體如下:
帳號檔案account.txt內容如下:
sam 123
david 12
kevin 123
lin 12
tailen 123
jack 12
鎖檔案account_lock.txt預設為空白
一、只針對帳號檔案裡的使用者進行判斷並鎖定,針對使用者和密碼各有三次錯誤重試機會。
1、流程圖如下:
代碼如下:
#!/usr/bin/python27#_*_ coding:utf-8 _*_import sys,os,getpassos.system('clear')i = 0while 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 #當使用者輸入錯誤時,迴圈值增加1else: sys.exit('使用者 %s 不存在,退出' % name) #使用者輸入三次錯誤後,異常退出 lock_file.close() #關閉LOCK檔案user_file.close() #關閉帳號檔案
二、針對帳號檔案裡的不存在的使用者也可以進行判斷並鎖定,針對使用者和密碼共有三次錯誤重試機會
代碼如下:
#_*_ coding:utf-8 _*_import sys,os,getpassos.system('clear')retry_limit = 3retry_count = 0account_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()