python基础作业2
阅读原文时间:2023年07月08日阅读:2

目录

  • 编写一个用户认证装饰器

  • 利用有参装饰器编写多种用户登录校验策略

  • 利用递归函数依次打印列表中每一个数据值

  • 获取用户权限并校验用户登录

    """
    1.编写一个用户认证装饰器
    函数:register login transfer withdraw
    基本要求
    执行每个函数的时候必须先校验身份 eg: jason 123
    拔高练习(有点难度)
    执行被装饰的函数 只要有一次认证成功 那么后续的校验都通过
    提示:全局变量 记录当前用户是否认证 """

    定义一个变量记录用户的登录状态

    is_login = False

    def login_auth(func_name):
    def inner(*args, *kwargs): global is_login if is_login: res = func_name(args, *kwargs) return res username = input('username>>>:').strip() password = input('password>>>>:').strip() if username == 'jason' and password =='123': # 将全局名称空间中记录用户登录状态的数据值改为True # global is_login is_login = True res = func_name(args, **kwargs)
    return res
    else:
    print('用户名或密码错误 无法执行函数')
    return inner

    @login_auth #register = login_auth(register)
    def register():
    print('注册功能')

    @login_auth
    def login():
    print('登录功能')

    @login_auth
    def shopping():
    print('购物功能')

    register()
    login()
    shopping()

    """
    1.直接写死的 jason 123
    2.数据来源于列表 ['jason|123','kevin|321','tony|222']
    3.数据来源于文件 jason|123\n tom|321\n
    """
    def login_auth(condition):
    def outer(func_name):
    def inner(*args, *kwargs): # 获取用户名和密码 username =input('username>>>:').strip() password=input('password>>>:').strip() if condition == 'absolute': if username == 'jason' and password == '123': res = func_name(args, *kwargs) return res else: print('用户名或密码错误') elif condition == 'list_type': user_list = ['jason|123','tony|321','kevin|222'] user_data = f'{username}|{password}' if user_data in user_list: res = func_name(args, *kwargs) return res else: print('用户名或密码错误') elif condition == 'file_type': with open(r'userinfo.txt','r',encoding='utf8') as f: for line in f: real_name,real_pwd = line.split('|') if real_name == username and real_pwd.strip('\n') == password: res = func_name(args, **kwargs)
    return res
    return inner
    return outer

    @login_auth('absolute')
    def index(*args, **kwargs):
    print('from index')

    @login_auth('list_type')
    def func(*args, **kwargs):
    print('from func')

    @login_auth('file_type')
    def foo(*args, **kwargs):
    print('from foo')

    index()

    func()

    foo()

    2.利用递归函数依次打印列表中每一个数据值

    l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]

    def getl(l1):
    if len(l1) == 0:
    return
    for i in l1:
    if isinstance(i,int):
    print(i)
    else:
    return getl(i)
    getl(l1)

    递归循环解题套路思路:

    1. 拿到题目先用伪代码实现

    2. 再用python代码实现,看是否需要重复几次,如果需要重复几次,观察规律,是否每次都变得更简单,如果发现重复几次且变得越来越简单,

    那就使用循环递归,循环递归要设置结束条件。

    #案例举例子:
    l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
    for i in l1:
    if isinstance(i,int):
    print(i)
    else:
    for j in i:
    if isinstance(j,int):
    print(j)
    else:
    for k in j:
    if isinstance(k,int):
    print(k)
    else:
    for n in k:
    if isinstance(n,int):
    print(n)
    #遇到上述情况就考虑使用递归,而且考虑最后一层l1是什么状态,比如l1有几个元素之类的

    """
    有下列用户数据
    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: 装饰器知识
    附赠: 实现上述主体功能即可
    其他扩展优化功能可暂且不写
    """

    """
    1.先写模板

    1. 再写用户校验
    2. 记录用户登录状态
    3. 再考虑用户权限问题
      """
      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']}
      }
      is_login = {
      'login_status': False, # 记录用户是否登录
      'user_access': None # 记录登录用户的权限
      }
      def login_auth(func_id):
      def outer(func_name):
      def inner(*args, *kwargs): # 6.先校验用户是否登录 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('请输入您的编号>>>>:').strip() # 2. 校验用户编号是否存在 if user_id not in user_data: print('用户编号不存在 无法完成身份校验') return # 3. 获取用户的用户名和密码 username = input('请输入您的用户名>>>>:').strip() password = input('请输入您的密码>>>>:').strip() # 4. 获取用户编号对应的真实数据进行比对 user_dict = user_data.get(user_id) if user_dict.get('name') == username and user_dict.get('pwd') == password: # 5. 登录成功之后修改字典登录状态 is_login['login_status'] = True # 6. 记录当前登录用户的权限编号 is_login['user_access'] = user_dict.get('access') #7. 校验当前函数编号是否在当前用户权限列表内 if func_id in user_dict.get('access'): res = func_name(args, **kwargs)
      return res
      else:
      print(f'您没有功能编号为{func_id}的函数执行权限')
      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()