登錄接口
需求:
1、輸入用戶密碼;
2、認真成功后顯示歡迎信息;
3、輸錯三次后鎖定
程序應該遵循先簡單后復雜的步驟,因此我把以上需求分解為幾個步驟來做
1、我先考慮的是輸入用戶賬號和密碼情況的循環,沒有考慮次數和鎖定。
代碼如下所示:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:Jack.Lee 4 # FileName: login1.py 5 6 import getpass 7 8 #i = 0 9 #j = 0 10 name = 'liguanjie' 11 passwd = '123456' 12 passwd_login = False 13 name_login = False 14 while not name_login: 15 username = input("Please enter your username:") 16 if name == username: 17 while not passwd_login: 18 #password = input("Please enter your password:") #該方式密碼采用明文方式輸入,由於pycharm不能對密文進行測試,所以采用這方式來代替驗證測試效果 19 password = getpass.getpass('Please enter your password:') #該方式密碼采用密文方式輸入 20 if passwd == password: 21 print("Welcome to login!") 22 passwd_login = True 23 else: 24 print("\033[31;0mSorry,try again.\033[0m") 25 name_login = True 26 else: 27 print("\033[31;0mSorry,try again.\033[0m")
2、對賬號和密碼輸入驗證優化,增強安全性,並且賬號或者密碼輸錯三次將停止驗證。
(while+if實現三次循環驗證)代碼如下:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:Jack.Lee 4 # FileName: login2.py 5 6 import getpass 7 user = 'liguanjie' 8 passwd = '123456' 9 login_flag = False 10 i = 0 11 12 while not login_flag: 13 if i < 3: 14 username = input("Please enter your username:") 15 password = input("Please enter your password:") 16 #password = getpass.getpass('Please enter your password:') 17 if user == username and passwd == password: 18 print("\033[34;1mWelcome to login!\033[0m") 19 login_flag = True 20 else: 21 print("\033[31;1mInvalid username or password .\033[0m") 22 i = i + 1 23 else: 24 print("\033[31;0mSorry,bye!\033[0m") 25 login_flag = True
(for+if 實現三次循環驗證)代碼如下:

1 import getpass 2 user = 'liguanjie' 3 passwd = '123456' 4 5 for i in range(3): 6 username = input("Please enter your username:") 7 password = input("Please enter your password:") 8 # password = getpass.getpass('Please enter your password:') 9 if user == username and passwd == password: 10 print("\033[34;1mWelcome to login!\033[0m") 11 break 12 else: 13 print("\033[31;1mInvalid username or password .\033[0m") 14 else: 15 print("\033[31;0mSorry,bye!\033[0m")
3、用戶和密碼采用一個文件存儲,通過查詢文件來獲取賬號和密碼

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:Jack.Lee 4 # FileName: login4.py 5 6 import getpass 7 8 login_flag = False 9 i = 0 10 11 while not login_flag: 12 if i < 3: 13 username = input("Please enter your username:") 14 password = getpass.getpass('Please enter your password:') 15 f = open('user_db.txt','r') 16 for line in f.readlines(): 17 user,passwd=line.strip().split() 18 if user == username and passwd == password: 19 print("\033[34;1mWelcome to login!\033[0m") 20 login_flag = True 21 break 22 else: 23 print("\033[31;1mInvalid username or password .\033[0m") 24 i = i + 1 25 f.close() 26 else: 27 print("\033[31;0mSorry,bye!\033[0m") 28 login_flag = True
4、先查詢用戶是否鎖定,再輸入密碼

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:Jack.Lee 4 # FileName:login4.py 5 '''程序運行流程如下: 6 1、輸入用戶名; 7 2、根據鎖定表判斷用戶是否處於鎖定狀態,如果處於鎖定,就終結程序,輸出鎖定提示語,否則執行下面的步驟; 8 3、輸入密碼; 9 4、根據用戶表的賬號和密碼,對應第一步和第三步輸入的用戶名和密碼是否正常,如果正確就輸出登錄成功,否則執行第五步; 10 5、繼續輸入密碼,當密碼輸錯次數大於3次時,就會終結整個程序,並且提示bye提示語,退出整個程序。 11 ''' 12 13 import getpass 14 import os 15 16 os.system('clear') #執行清屏,模擬登錄效果 17 login_flag = False 18 i = 0 19 20 username = input("Please enter your username:") 21 l = open('lock.txt') 22 for line in l.readlines(): 23 if username == line.strip(): 24 print("\033[31;1mSorry,%s is locked!\033[0m'"%username) 25 break 26 else: 27 while not login_flag: 28 if i < 3: 29 password = getpass.getpass('Please enter your password:') 30 f = open('user_db.txt') 31 for line in f.readlines(): 32 user,passwd=line.strip().split() 33 if user == username and passwd == password: 34 print("\033[34;1mWelcome to login!\033[0m") 35 login_flag = True 36 break 37 else: 38 print("\033[31;1mInvalid username or password .\033[0m") 39 i = i + 1 40 f.close() 41 else: 42 print("\033[31;1mSorry,bye!\033[0m") 43 login_flag = True
5、先查詢用戶是否鎖定,不在鎖定狀態再輸入密碼,當輸入密碼次數大於三次就把用戶寫進鎖定表

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:Jack.Lee 4 # FileName: login5.py 5 6 '''程序運行流程如下: 7 1、輸入用戶名; 8 2、根據鎖定表lock.txt判斷用戶是否處於鎖定狀態,如果處於鎖定,就終結程序,輸出鎖定提示語,否則執行下面的步驟; 9 3、輸入密碼; 10 4、根據用戶表user_db.txt的賬號和密碼,對應第一步和第三步輸入的用戶名和密碼是否正常,如果正確就輸出登錄成功,否則執行第五步; 11 5、繼續輸入密碼,當密碼輸錯次數大於3次時,就會終結輸密碼流程,並進行第6步; 12 6、提示輸入密碼次數過多,並且把改用戶名存儲到鎖定表lock.txt; 13 7、退出整個程序 14 ''' 15 16 import getpass 17 import os 18 19 os.system('clear') #執行清屏,模擬登錄效果 20 login_flag = False 21 i = 0 22 23 username = input("Please enter your username:") 24 l = open('lock.txt') 25 for line in l.readlines(): 26 # name = line.strip() 27 if username == line.strip(): 28 print("\033[31;1mSorry,%s is locked!\033[0m'"%username) 29 break 30 31 else: 32 while not login_flag: 33 if i < 3: 34 password = getpass.getpass('Please enter your password:') 35 f = open('user_db.txt') 36 for line in f.readlines(): 37 user, passwd = line.strip().split() 38 if user == username and passwd == password: 39 print("\033[34;1mWelcome to login!\033[0m") 40 login_flag = True 41 f.close() 42 break 43 else: 44 print("\033[31;1mInvalid username or password .\033[0m") 45 i = i + 1 46 else: 47 print("\033[31;1mSorry,you input too many, %s has been locked!bye!\033[0m"%username) 48 lock = open('lock.txt', 'a') 49 lock.write(username + '\n') 50 login_flag = True 51 lock.close() 52 l.close()
備注:上面程序發現如果輸入用戶不在用戶表,也進行輸入密碼處理,並且在輸入次數大於3次也把該用戶寫入鎖定表,不符合常理要求。因此要對輸入用戶名判斷,如何在用戶表查不到輸入的用戶應提示重新輸入用戶名和密碼。
優化如例6
6、先查詢用戶是否鎖定,再判斷用戶是否存在
根據上述的嘗試,並且對上面優化了一下。原理是無論是用戶是什么狀態,都要輸入賬號和密碼再做判斷,輸入完后進行鎖定判斷;然后再做用戶是否存在判斷,如果用戶不存在,重新輸入賬號和密碼,次數超過3次自動退出程序;如果用戶存在再對密碼判斷,密碼錯誤運行給三次輸入,如果3次都輸錯,就把該用戶寫入鎖定用戶表。
程序如下:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:Jack.Lee 4 # FileName:login_final.py 5 6 '''程序運行流程如下: 7 1、輸入用戶名和密碼; 8 2、根據鎖定表lock.txt判斷用戶是否處於鎖定狀態,如果處於鎖定,就終結程序,輸出鎖定提示語,否則執行下面的步驟; 9 3、再根據用戶表user.txt的賬號來判斷是否存在該用戶,如果不存在直接跳到開始重新輸入賬號和密碼; 10 4、在第三步如果用戶存在,接下來判斷密碼是否正確,如果密碼正確,就顯示登陸成功,並且跳出;否則執行第5步; 11 5、密碼不正確,進行再次輸入密碼,但密碼輸入過程不能大於3次; 12 6、當密碼輸錯次數大於3次時,把用戶寫入到鎖定表lock.txt,並且跳出流程。 13 ''' 14 #import getpass 15 16 name_flag = False #定義用戶和密碼一次輸入的跳出標識位,為True跳出 17 passwd_flag = False #定義密碼輸錯重復輸密碼的跳出標識位,為True跳出 18 i = 0 19 j = 0 20 21 while not name_flag: #name_flag不為假,即真,執行下面步驟 22 username = input("Username:") #把輸入用戶名和密碼一次性輸入再做判斷,該方式接近實際 23 #password = getpass.getpass('Password:') #該方式為密文密碼輸入,由於pycharm沒有getpass模塊,所以不采用,正式環境要求使用 24 password = input("Password:") 25 #判斷是否鎖定 26 lock_file = open('lock.txt','r') #打開鎖定表 27 for line in lock_file.readlines(): #循環讀取每行數據 28 name = line.strip() #去掉空格把行數據給name 29 if username == name : #下面判斷用戶是否給鎖定 30 print("\033[31;1m對不起!%s用戶已給鎖定,請聯系管理員解鎖。\033[0m'" %username) 31 name_flag = True #由於用戶給鎖定,跳出整個輸入過程 32 lock_file.close() 33 break 34 else: #由於沒有鎖定,進行下面判斷賬號是否存在和密碼是否正確 35 user_file = open('user.txt') 36 for line in user_file.readlines(): 37 user,passwd = line.strip().split() 38 if username == user: #判斷用戶是否存在,如果存在就執行判斷密碼,否則輸出密碼不存在 39 while not passwd_flag: #passwd_flag不為假,即真,執行下面步驟 40 if password == passwd: #密碼正確,進行登錄,顯示歡迎信息 41 print("\033[34;1m登錄成功,歡迎來到這里!\033[0m") 42 name_flag = True #賦值True,用來跳出大while循環 43 passwd_flag = True #賦值True,用來跳出判斷密碼的while循環 44 exit() #由於外面還有if循環,需直接跳出所有循環,采用exit() 45 else: #密碼不正確,請重試,次數不超過3次 46 i +=1 #密碼輸入次數+1 47 if i < 3: #if密碼次數小於3繼續執行輸入密碼 48 print("\033[31;1m密碼錯誤,請重試。\033[0m") 49 print("\033[34;1m溫馨提示:你還有%s次機會,賬號將給鎖定,請慎重!\033[0m"%(3-i)) 50 password = input("Password:") 51 else: 52 print("\033[31;1m對不起!你輸入的次數過多, %s用戶已給鎖定!\033[0m" % username) # 輸出提示語:輸入次數過多,給鎖定 53 lock_file = open('lock.txt', 'a') 54 lock_file.write(username + '\n') # 把輸入密碼錯誤的用戶名寫入鎖定表 55 name_flag = True 56 passwd_flag = True 57 lock_file.close() # 關閉鎖定表 58 exit() #跳出,結束 59 else: #用戶不存在,輸出提示語,並且允許重輸 60 j +=1 61 if j < 3: 62 print("\033[31;1m你輸入的用戶不存在,請重試。\033[0m") 63 break #跳出該if循環 64 else: 65 name_flag = True #輸入用戶超過3次,跳出整個輸入過程 66 print("\033[31;1m請核實賬號再試,謝謝!\033[0m") 67 break #跳出該循環
由於現階段在基礎學習階段,所以先簡單再復雜,一步步來。