函数

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()

 

posted @ 2022-10-12 19:45  莫~慌  阅读(21)  评论(0编辑  收藏  举报