利用装饰器实现用户的权限验证,逻辑关系:
- 如果用户出现购买行为,调用buy 函数,则对用户进行权限验证
- 对用户进行登陆权限验证
2.1 用户已登陆,跳转至 step3
2.2 用户未登录,进行用户登录- 对用户进行用户权限验证
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()
执行结果:
【小结】
多装饰器装饰:装饰的顺序是自下而上(就近原则),而调用/执行的顺序是自上而下(顺序执行)。