023_Python装饰器_案例_多装饰器_权限验证

利用装饰器实现用户的权限验证,逻辑关系:

  1. 如果用户出现购买行为,调用buy 函数,则对用户进行权限验证
  2. 对用户进行登陆权限验证
    2.1 用户已登陆,跳转至 step3
    2.2 用户未登录,进行用户登录
  3. 对用户进行用户权限验证
    3.1 用户权限为 1,可进行购买操作
    3.2 用户权限不是1,不可进行相应的购买操作
from functools import wraps
# 系统中的用户信息;
db = {
    'root': {
        'name': 'root',
        'passwd': '6666',
        'is_super': 0  # 0-不是 1-是
    },
    'admin': {
        'name': 'admin',
        'passwd': '8888',
        'is_super': 1  # 0-不是 1-是
    }
}
# 存储当前登录用户的信息;
login_user_session = {}


def is_login(func):
    """判断用户是否登录的装饰器"""
    # @wraps保留被装饰函数的函数名和帮助文档, 否则是wrapper的信息.
    @wraps(func)
    def wrapper1(*args, **kwargs):
        if login_user_session:
            result = func(*args, **kwargs)
            return result
        else:
            print("未登录, 请先登录.......")
            print("跳转登录".center(50, '*'))
            user = input("User: ")
            passwd = input('Password: ')
            if user in db:
                if db[user]['passwd'] == passwd:
                    login_user_session['username'] = user
                    print('登录成功')
                    # ***** 用户登录成功, 执行后续操作;
                    result = func(*args, **kwargs)
                    return result
                else:
                    print("用户/密码有误")
            else:
                print("用户/密码有误")

    return wrapper1


def is_permission(func):
    """判断用户是否有权限的装饰器"""

    # @wraps保留被装饰函数的函数名和帮助文档, 否则是wrapper的信息.
    @wraps(func)
    def wrapper2(*args, **kwargs):
        print("判断是否有权限......")
        current_user = login_user_session.get('username')
        permissson = db[current_user]['is_super']
        if permissson == 1:
        	print("%s用户权限匹配" % current_user)
            result = func(*args, **kwargs)
            return result
        else:
            print("用户%s没有权限" % (current_user))
    return wrapper2


# 多个装饰器装饰的顺序是自下而上(就近原则),而调用/执行的顺序是自上而下(顺序执行)。
"""
装饰的过程: 
1). @is_permission:  buy = is_permission(buy)  ===> buy=wrapper2
2). @is_login: buy = is_login(buy)  ===> buy = is_login(wrapper2)   ===> buy=wrapper1
"""


@is_login
@is_permission
def buy():
    print("购买商品........")


"""
调用的过程: 
    1). buy() ===>  wrapper1()  print("判断用户是否登录..........")
    2). wrapper2()              print("判断用户是否有权限..........")
    3). buy()                   print("购买商品........")                 
"""
if __name__ == '__main__':
    buy()

执行结果:
在这里插入图片描述
在这里插入图片描述
【小结】
多装饰器装饰:装饰的顺序是自下而上(就近原则),而调用/执行的顺序是自上而下(顺序执行)。

发布了37 篇原创文章 · 获赞 0 · 访问量 5317

猜你喜欢

转载自blog.csdn.net/qq_21156327/article/details/103689234