一个类似权限验证的功能性装饰器,装饰器不带参数用法
如果用户出现购买行为,调用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

浙公网安备 33010602011771号