python后台开发中的权限装饰器的使用

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_
                        

     

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值