装饰器认证功能

在编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。
# 这个作业之上进行升级操作:
# 设置两套密码,一套为微信账号密码,一套为qq账号密码保存在文件中。
# 设置四个函数,分别代表
# 京东首页,京东超市,淘宝首页,淘宝超市。
# 循环打印四个选项:东首页,京东超市,淘宝首页,淘宝超市。
# 供用户选择,用户输入选项后,执行该函数,四个函数都加上认证功能,只要登陆成功一次,在选择其他函数,后续都无需输入用户名和密码。
# 相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。

dic = {
'username':None,
'status':False,
}


def login(flag):
def wrapper(func):
def inner(*args, **kwargs):
if dic['status']:
ret = func(*args, **kwargs)
return ret
else:
i = 0
while i < 3:
username = input('请输入用户名(用%s账号):' % flag).strip()
password = input('请输入密码:').strip()
with open('user_pwd',encoding='utf-8') as f1:
msg_dic = eval(f1.readline())
# {'微信': {'password': '123', 'username': '老男孩'}, 'qq': {'password': '123', 'username': '老男孩1'}}
if username == msg_dic[flag]['username'] and password == msg_dic[flag]['password']:
dic['username'] = username
dic['status'] = True
ret = func(*args, **kwargs)
return ret
else:
print('您输入的用户或者密码错误,请重新输入,还有%s次机会' % (2-i))
i += 1
return inner
return wrapper




@login('微信')
def taobao_home():
print('淘宝首页')

@login('微信')
def taobao_shop():
print('淘宝超市')

@login('qq')
def jingdong_home():
print('京东首页')

@login('qq')
def jingdong_shop():
print('京东超市')

choice_dict = {
1: taobao_home,
2: taobao_shop,
3: jingdong_home,
4: jingdong_shop,
}

while True:
print('1 淘宝首页 2 淘宝超市 3 京东首页 4 京东超市')
choice_num = input('请选择输入的序号:').strip()
if choice_num.isdigit():
choice_num = int(choice_num)
if 0 < choice_num <= len(choice_dict):
choice_dict[choice_num]()
else:
print('请输入范围内的序号')
else:
print('您输入的有非法字符,请重新输入')
原文地址:https://www.cnblogs.com/nicess/p/8709564.html