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