登录接口

登录接口
需求:
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("33[31;0mSorry,try again.33[0m")
25         name_login = True
26     else:
27         print("33[31;0mSorry,try again.33[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("33[34;1mWelcome to login!33[0m")
19             login_flag = True
20         else:
21             print("33[31;1mInvalid username or password .33[0m")
22             i = i + 1
23     else:
24         print("33[31;0mSorry,bye!33[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("33[34;1mWelcome to login!33[0m")
11         break
12     else:
13         print("33[31;1mInvalid username or password .33[0m")
14 else:
15     print("33[31;0mSorry,bye!33[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("33[34;1mWelcome to login!33[0m")
20                login_flag = True
21                 break
22         else:
23             print("33[31;1mInvalid username or password .33[0m")
24             i = i + 1
25         f.close()
26     else:
27         print("33[31;0mSorry,bye!33[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("33[31;1mSorry,%s is locked!33[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("33[34;1mWelcome to login!33[0m")
35                     login_flag = True
36                     break
37             else:
38                 print("33[31;1mInvalid username or password .33[0m")
39                 i = i + 1
40                 f.close()
41         else:
42             print("33[31;1mSorry,bye!33[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("33[31;1mSorry,%s is locked!33[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("33[34;1mWelcome to login!33[0m")
40                     login_flag = True
41                     f.close()
42                     break
43             else:
44                 print("33[31;1mInvalid username or password .33[0m")
45                 i = i + 1
46         else:
47             print("33[31;1mSorry,you input too many, %s has been locked!bye!33[0m"%username)
48             lock = open('lock.txt', 'a')
49             lock.write(username + '
')
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("33[31;1m对不起!%s用户已给锁定,请联系管理员解锁。33[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("33[34;1m登录成功,欢迎来到这里!33[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("33[31;1m密码错误,请重试。33[0m")
49                             print("33[34;1m温馨提示:你还有%s次机会,账号将给锁定,请慎重!33[0m"%(3-i))
50                             password = input("Password:")
51                         else:
52                             print("33[31;1m对不起!你输入的次数过多, %s用户已给锁定!33[0m" % username)  # 输出提示语:输入次数过多,给锁定
53                             lock_file = open('lock.txt', 'a')
54                             lock_file.write(username + '
')  # 把输入密码错误的用户名写入锁定表
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("33[31;1m你输入的用户不存在,请重试。33[0m")
63                     break                                #跳出该if循环
64                 else:
65                     name_flag = True                    #输入用户超过3次,跳出整个输入过程
66                     print("33[31;1m请核实账号再试,谢谢!33[0m")
67                     break                                #跳出该循环
login_final

由于现阶段在基础学习阶段,所以先简单再复杂,一步步来。

Keep empowering yourself successfully...
原文地址:https://www.cnblogs.com/jack34/p/6101132.html