DEFAULT_URL = 'dingdong_bp.information_setting'#用户权限验证失败后默认的跳转地址
permission = DingdongPermission(blueprint = dingdong_bp)#初始化权限装饰器
@permission(DingdongPermission.user_permission,{'status':True},DEFAULT_URL)#用户权限装饰器
@permission(permission_func=DingdongPermission.admin_permission,kwargs_={'level':1})#管理员权限装饰器
class DingdongPermission(Permission)
class Permission:
#类装饰器基类
def __init__(self,blueprint):
'''
权限初始化绑定参数
:param blueprint:蓝图名
'''
self.blueprint = blueprint.name
@staticmethod
def admin_permission(level:int = 1) -> bool:
'''
管理员权限验证函数
:param level:权限等级
:return:验证结果
'''
admin_info = session.get('admin_info',None)
if admin_info and admin_info.get('level',None) >= level:
return True
else:
return False
@staticmethod
def user_permission(status:bool = None) -> bool:
"""用户权限验证函数
:param status:账户状态
:return :验证结果
"""
user_info = session.get('user_info',None)
if user_info and (user_info.get(status),None) is status or status is None):
return True
else:
return False
def __call__(self,permission_func,kwargs_,backtrack=None):
"""权限装饰器
:param permission_func:权限函数
:param kwargs_:权限函数的参数
:param backtrack:失败时跳转的地址,优先通过url_for解析蓝图地址,无法解析,则尝试直接跳转地址
"""
def transfer_(func):
@wraps(func)
def inner(*args,**kwargs):
if permission_func(**kwargs_):检验权限
return func(*args,**kwargs)
else:
nonlocal backtrak
if backtrack is None:#默认返回登录界面,传递请求地址,待登录后挑战
backtrack = f'{self.blueprint}.login'#登录页面蓝图参数
return redirect(url_for(backtrack)+f'?url={request.url}')
try:
return redirect(url_for(backtrack))#尝试当做蓝图地址解析
except BuildError as err:
print(err)
return redirect(backtrack)#直接挑战地址
return inner
return transfer_