登录接口
需求:
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 #跳出该循环
由于现阶段在基础学习阶段,所以先简单再复杂,一步步来。
Keep empowering yourself successfully...