#5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),#要求登录成功一次,后续的函数都无需再输入用户名和密码(升级题)
‘‘‘def verity_update(*func_name):
def inner(*args, **kwargs):
counts = 1
flag = 1
while flag:
if counts <= 3:
user_name = input("请输入您的用户名:").strip()
user_pwd = input("请输入您的密码:").strip()
with open("user_table.txt", "r",encoding="utf-8") as f:
for line in f:
line = line.strip().split(":")
name = line[0]
pwd = line[1]
if user_name == name and user_pwd == pwd:
print("登陆成功,欢迎光临{}".format(user_name))
ret = func_name(*args, **kwargs)
return ret
else:
print("用户名或密码错误,请重新输入,您还有%s次机会!" % (3-counts))
counts += 1
else:
print("3次都不中,洗洗睡吧,哥们/姐们儿……")
return
return inner‘‘‘logging_status= False #如果登陆成功后,就不用去登陆(如果在函数里写,会每次运行函数都将状态重设为false了,就导致,后面不管登陆没有都要重新登陆)
defverity_update(func):def inner(*args, **kwargs):global logging_status #要引用全局变量且改变其值logging_status
if logging_status: #如果已经登陆了,就不用再去登陆了,可以直接执行函数
ret = func(*args, **kwargs)returnretelse:
count= 1
while count < 4:
username= input("请输入您的用户名:").strip()
password= input("请输入您的密码:").strip()
with open(‘user_table.txt‘,encoding="utf-8") as f:for line inf:
line= line.strip().split(":")if username == line[0] and password == line[1]: #如果密码正确,就执行功能函数
logging_status = True #如果密码正确就是登陆成功,要改变登陆状态,不用再次登陆
ret = func(*args,**kwargs)returnretelse:print("密码不正确,重新登陆,还有%d次机会" %(3-count))
count+= 1
else:print("3次已过,bey-bey……") #3次还没过,就退出函数
return
returninner
@verity_updatedef func_name(*args, **kwargs):print(11)
@verity_updatedef func_name1(*args, **kwargs):print(22)
@verity_updatedef func_name2(*args, **kwargs):print(33)
func_name()
func_name1()
func_name2()
文件中拿出来比对