登錄接口


登錄接口
需求:
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")
login1


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
login2

 
(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")
login3


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
login4

 

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
login5


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()
login6


備注:上面程序發現如果輸入用戶不在用戶表,也進行輸入密碼處理,並且在輸入次數大於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                                #跳出該循環
login_final

由於現階段在基礎學習階段,所以先簡單再復雜,一步步來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM