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

如果用户出现购买行为,调用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 

  

  

原文地址:https://www.cnblogs.com/potato-chip/p/14663879.html