函数
1. 编写一个用户认证装饰器
函数:register login transfer withdraw
基本要求
执行每个函数的时候必须先校验身份 eg: Alex 123
def login_auth(func_name): def inner(*args,**kwargs): username = input('username>>>:').strip() password = input('password>>>:').strip() if username == 'Alex' and password == '123': res = func_name(*args, **kwargs) return res else: print('用户名或密码错误') return inner @login_auth def register(): print('注册功能') @login_auth def login(): print('登录功能') @login_auth def transfer(): print('转账功能') @login_auth def withdraw(): print('取款功能') register() login() transfer() withdraw()
2. 拔高:
执行被装饰的函数,只要有一次认证成功,那么后续的校验都通过
提示:全局变量 记录当前用户是否认证
is_login = False def login_auth(func_name): def inner(*args,**kwargs): global is_login # 局部修改全局要用global # 先判断全局名称空间中的变量名is_login绑定的值是否为True if is_login: res = func_name(*args, **kwargs) return res username = input('username>>>:').strip() password = input('password>>>:').strip() if username == 'Alex' and password == '123': # 将记录用户登录状态的数据值改为True is_login = True res = func_name(*args, **kwargs) return res else: print('用户名或密码错误') return inner @login_auth def register(): print('注册功能') @login_auth def login(): print('登录功能') @login_auth def transfer(): print('转账功能') @login_auth def withdraw(): print('取款功能') register() login() transfer() withdraw()
3. 利用有参装饰器编写不同来源的用户的登录校验策略
def login_auth(data_source): def outer(func_name): def inner(*args, ** kwargs): username = input('username>>>:') password = input('password>>>:') if data_source == '1': data_list = ['a|1', 'b|2', 'c|3'] user_data = f'{username}|{password}' if user_data in data_list: res = func_name(*args, **kwargs) return res print('用户名和密码不在此列表') elif data_source == '2': data_dict = {'a':'1', 'b':'2', 'c':'3'} get_pwd = data_dict.get(username) if password == get_pwd: res = func_name(*args, **kwargs) return res else: print('用户名和密码不在字典中') elif data_source == '3': with open(r't.txt','r', encoding='utf8') as f: for line in f: real_name, real_pwd = line.split('|') if username == real_name and password == real_pwd.strip('\n'): res = func_name(*args, **kwargs) return res else: print('用户名和密码不在文件中') return inner return outer @login_auth('1') def func1(*args, **kwargs): print('list source') @login_auth('2') def func2(*args, **kwargs): print('dict source') @login_auth('3') def func3(*args, **kwargs): print('txt source') func1() func2() func3()
4. 有下列用户数据
user_data = {
'1': {'name': 'jason', 'pwd': '123', 'access': ['1', '2', '3']},
'2': {'name': 'kevin', 'pwd': '321', 'access': ['1', '2']},
'3': {'name': 'oscar', 'pwd': '222', 'access': ['1']}
}
并有三个函数
def func1():
pass
def func2():
pass
def func3():
pass
要求:调用上述三个函数的时候需要从user_data中校验用户身份是否正确
并获取当前登录用户拥有的可执行函数功能编号即键access对应的功能编号列表
func1是1、func2是2、func3是3
并且一旦用户登录成功之后后续函数的调用不再校验用户身份
请思考如何获取函数功能编号 如何校验用户身份 如何校验权限
ps:装饰器知识 附赠:实现上述主体功能即可 其他扩展优化功能可暂且不写
user_data = { '1': {'name': 'jason', 'pwd': '123', 'access': ['1', '2', '3']}, '2': {'name': 'kevin', 'pwd': '321', 'access': ['1', '2']}, '3': {'name': 'oscar', 'pwd': '222', 'access': ['1']} } """ 1.先写模板 2.再写用户校验 3.记录用户登录状态 4.再考虑用户权限问题 """ is_login = { 'login_status': False, # 记录用户是否登录 'user_access': None # 记录登录用户的权限 } is_login = {} def login_auth(func_id): def outer(func_name): def inner(*args, **kwargs): # 7. 'login_status'为None时,此if分支下的函数体代码不会执行,直接从1开始,第一次登录成功之后,'login_status'修改为True,会执行此分支 if is_login.get('login_status'): # 8. 第二次和第三次循环时也需要判断当前函数编号是否在用户权限内 if func_id not in is_login.get('user_access'): print(f'您没有执行{func_id}功能编号的权限') return res = func_name(*args, **kwargs) return res # 1.获取用户功能编号 user_id = input('请输入您的编号>>>:') # 2.判断用户名和密码是否在字典中 if user_id in user_data: # 2. 输入用户名和密码 username = input('username>>>:') password = input('password>>>:') # 3.根据输入的用户编号获取编号所对应的用户信息 user_dict = user_data.get(user_id) # 4.按k取值,分别获得对应编号的员工姓名和密码,并与输入的用户名和密码进行核对 if username == user_dict.get('name') and password == user_dict.get('pwd'): # 5.登录成功之后把登录状态改为True,把用户权限改为access对应的编号,并执行函数 is_login['login_status'] = True is_login['user_access'] = user_dict.get('access') # 6. 校验当前函数编号是否在用户权限内 if func_id in user_dict.get('access'): res = func_name(*args, **kwargs) return res else: print(f'您没有执行{func_id}功能编号的权限') else: print('用户名或密码错误') else: print('您输入的用户编号不存在') return inner return outer @login_auth('1') def func1(): print('from func1') @login_auth('2') def func2(): print('from func2') @login_auth('3') def func3(): print('from func3') func1() func2() func3()