1 # 编写装饰器,为多个函数加上认证的功能, 2 # 在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,后面的函数不用再登陆,就可以执行,本功能类似如登陆一个购物网站,在一个页面登陆进去了,其他的页面就不需要登陆 3 # ,正确的用户名和密码是: alex 123 4 ''' 5 思路: 6 需求==>要每一个函数进入前都判断是否是登陆状态,只要一个成功,其他都不用再登陆 7 1、定义一个标签来标识登陆状态、初始状态是0,每次进入都判断是否登陆成功 8 2、登陆成功的情况下、执行功能函数、标记下登陆状态 9 3、未登录的情况下,开始三次登陆判断,登陆成功,执行功能函数,三次都不成功,退出 10 11 ''' 12 logging_status = 0 # 一开始是失败的、未登陆 13 def verify_user(fn): 14 def inner(*args, **kwargs): 15 '''函数执行之前''' 16 global logging_status 17 if logging_status == 1: #登陆成功了,(注意:如果后面改变了flag值,故需要global flag) 18 ret = fn(*args, **kwargs) #直接执行函数 19 return ret # 返回退出函数,相当于break 20 else: 21 counts = 1 22 while counts < 4: 23 userName = input("请输入你的用户名:") 24 password = input("请输入您的密码:") 25 if userName == "alex" and password == "123": 26 logging_status = 1 # 登陆成了改状态码 27 ret = fn(*args, **kwargs) 28 return ret # 登陆成功了,结束函数 29 counts += 1 30 else: # 登陆三次失败退出 31 return 32 return inner 33 34 @verify_user 35 def add(): 36 print("增加功能模块") 37 return 1 38 39 @verify_user 40 def delete(): 41 print("删除功能模块") 42 return 1 43 44 @verify_user 45 def update(): 46 print("修改功能模块") 47 return 1 48 49 @verify_user 50 def select(): 51 print("查询功能模块") 52 53 add() 54 delete() 55 update() 56 select()
结果:
请输入你的用户名:alex
请输入您的密码:123
增加功能模块
删除功能模块
修改功能模块
查询功能模块