Python基礎-裝飾器,python基礎裝飾
待更新:
裝飾器執行個體
程式需求:
- 使用者最多嘗試3次登陸
- 當存在的使用者登陸失敗3次後,鎖定該使用者,限制登陸
程式碼:
1 import time 2 3 4 def run_timer(func): #計時器函數 5 def wrapper(*args, **kwargs): #裝飾器 6 start = time.time() #開始計時 7 func(*args, **kwargs) #運行程式 8 end = time.time() #停止計時 9 print('Run time is %ss' % (end - start)) #列印程式運行時間長度10 11 return wrapper12 13 14 def identiy():15 """使用者登陸驗證程式16 最多可嘗試3次登陸17 當某一存在的使用者輸入錯誤密碼3次後,鎖定該使用者,限制登陸"""18 with open('account_bak', 'r+') as f_account, open('locked_list', 'a+') as f_locked:19 f = 0 #程式傳回值變數20 l = [] #被鎖定使用者列表21 user_input = [] #輸入錯誤密碼的使用者名稱列表22 count = 0 # 登陸次數計數器23 flag = True # 登陸迴圈控制開關24 while flag and count < 3:25 name = input('Please input username:') # 輸入使用者名稱26 pwd = input('Please input password:') # 輸入使用者密碼27 f_locked.seek(0) #"a+"模式開啟後,檔案位置位於末尾,要遍曆檔案內容,需要將指標移至檔案起始位置28 for locked_user in f_locked: #將被鎖定使用者名稱單寫入列表29 l.append(locked_user.strip())30 if name in l:31 print('This user has been locked!') #如果當前欲登陸使用者在被鎖定列表中,提示並重新輸入登陸資訊32 else:33 user_input.append(name) #將當前輸入的使用者名稱加入到列表34 f_account.seek(0) #迴圈前將檔案位置移至起始位置35 for line in f_account: #遍曆使用者登陸資料檔案36 s = eval(line) #將該檔案的內容轉換為字典格式37 if name == s['name'] and pwd == s['password']: #判斷使用者名稱和密碼是否正確38 print('Authenticate successful') #使用者名稱和密碼匹配,認證成功,結束迴圈,並將f=1返回39 f = 140 flag = False41 break42 if f == 1: #使用者名稱和密碼不匹配,提示使用者輸入錯誤43 continue44 print('Wrong name or password!')45 count += 1 #錯誤次數加1,當count等於3時,結束迴圈46 if len(user_input) == 3: #如果該列表長度等於3,說明使用者3次登陸均失敗47 if user_input[0] == user_input[1] == user_input[2]: #判斷3次登陸是否時同一使用者名稱48 f_account.seek(0) #重設檔案位置為起始位置49 l = [] #建立空列表,存放使用者登陸檔案中的使用者名稱資訊50 for line in f_account: #遍曆使用者登陸檔案51 s = eval(line) #將行內容轉換為字典格式52 l.append(s['name']) #將使用者名稱加入到列表53 if user_input[0] in l: #判斷登陸失敗的使用者名稱是否在上述列表中54 print('This user has been locked!') #提示使用者將鎖定該登陸名55 f_locked.write(user_input[0] + '\n') #將該登入名稱加入鎖定檔案56 f_locked.flush() #即時重新整理檔案57 return f58 59 60 def auth(source):61 """使用者登陸認證程式的裝飾器"""62 def auth_main(func):63 def wrapper(*args, **kwargs):64 if source == 'file': #判斷認證來源類型是否為‘file’65 if (identiy() == 1): #調用使用者登陸認證程式66 res = func(*args, **kwargs) #運行被裝飾的程式67 return res68 elif source == 'ldap': #另外一種認證來源類型69 def wrapper_2(*args, **kwargs):70 print('Nothing here!')71 pass72 return wrapper73 return auth_main74 75 76 @auth(source = 'file') #將使用者登陸認證功能裝飾程式‘func_1’77 @run_timer #將程式計時功能裝飾程式‘func_1’78 def func_1(): #被裝飾程式79 time.sleep(1)80 print('This is function_1')81 82 83 func_1() #調用被裝飾程式計時+登陸認證 裝飾器
驗證過程:
1. account檔案:存放使用者登陸資料
2. locked_list檔案:存放被鎖定使用者名稱
當前為空白
3. 嘗試登陸正確的使用者
4. 嘗試不同使用者登陸失敗
5. 嘗試同一使用者登陸失敗
6. 嘗試同一使用者登陸失敗,但該使用者本身不存在