• 一个类似权限验证的功能性装饰器,装饰器不带参数用法


    如果用户出现购买行为,调用buy 函数,则对用户进行权限验证(权限验证分为两部分,一部分是是否有登录的权限验证,另一部分是是否有购买的权限验证)
    对用户进行登陆权限验证
    2.1 用户已登陆,跳转至 step3
    2.2 用户未登录,进行用户登录
    对用户进行用户权限验证
    3.1 用户权限为 1,可进行购买操作
    3.2 用户权限不是1,不可进行相应的购买操作

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    from functools import wraps
    #系统中的用户信息,有一个字典来代表一个数据库的记录
    db={
        'root':{
            'name':'root',
            'password':'6666',
            'is_super':0
        },
        'admin':{
            'name':'admin',
            'password':'8888',
            'is_super':1
        }
    }
    
    #缓存当前登录用户的信息
    login_user_session={}
    
    def is_login(func):
        """
        判断用户是否已经登录的装饰器
        """
        def wrapper1(*args,**kwargs):
            if login_user_session:
                result=func(*args,**kwargs)
                return result
            else:
                """
                用户没有登录的话,用户需要登录,在登录时,验证用户信息是否有效
                """
                print("未登录,请先登录....")
                print("跳转到登录界面".center(50,'*'))
                user=input('user:')
                password=input("password:")
                if user in db:
                    if db[user]['password']==password:
                        login_user_session['username']=user
                        print("登录成功")
                        #用户登录成功,执行后续操作
                        result=func(*args,**kwargs)
                        return result
                    else:
                        print('用户名或者密码有误')
                else:
                    print("该用户没有注册")
        return wrapper1
    
    def is_perssion(func):
        """
        判断用户是否有购买的权限,此时用户是已经登录上了
        """
        def wrapper2(*args,**kwargs):
            print("判断是否有购买权限")
            current_user=login_user_session.get('username')
            perssion=db[current_user]['is_super']
            if perssion ==1:
                print("%s用户权限匹配,可以购买" % current_user)
                result=func(*args,**kwargs)
                return result
            else:
                print("用户%s没有权限" % current_user)
        return wrapper2
    
    # 多个装饰器装饰的顺序或过程是自下而上(就近原则),而调用/执行的顺序是自上而下(顺序执行)。
    """
    装饰器的装饰过程,是就近原则如下:
    @is_perssion:buy=is_perssion(buy)-->buy=wrapper2
    @is_login:buy=is_login(buy)-->buy=is_login(wrapper2)--->buy=wrapper1
    buy=is_login(is_perssion(buy))-->buy()=is_login(is_perssion(buy))()
    """
    
    @is_login
    @is_perssion
    def buy():
        print("购买商品....")
    
    
    """
    调用的过程,是从上到下的执行过程: 
        1). buy() ===>  wrapper1()  print("判断用户是否登录..........")
        2). wrapper2()              print("判断用户是否有权限..........")
        3). buy()                   print("购买商品........")                 
    
    """
    if __name__=='__main__' :
        buy()
    

    执行结果:

    未登录,请先登录....
    *********************跳转到登录界面**********************
    user:root
    password:6666
    登录成功
    判断是否有购买权限
    用户root没有权限
    
    未登录,请先登录....
    *********************跳转到登录界面**********************
    user:admin
    password:8888
    登录成功
    判断是否有购买权限
    admin用户权限匹配,可以购买
    购买商品....
    

     

    参考:https://blog.csdn.net/qq_21156327/article/details/103689234 

      

      

  • 相关阅读:
    Git 安装使用及基础命令
    Ubuntu Anaconda3 环境下安装caffe
    Anaconda 安装及Python 多版本间切换
    基于 ZooKeeper 的分布式锁实现
    java 判断点是否在一条线段上
    python 安装opencv及问题解决
    python Opencv图像基础操作
    sctf pwn200
    BCTF warmup 50
    linux shadow破解
  • 原文地址:https://www.cnblogs.com/potato-chip/p/14663879.html
Copyright © 2020-2023  润新知