Python基礎-裝飾器,python基礎裝飾

來源:互聯網
上載者:User

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. 嘗試同一使用者登陸失敗,但該使用者本身不存在

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.