Django项目-利用带参装饰器实现函数的权限检测

一般来说,装饰器是直接使用不带参数的:

@hello_world
def funcgg():
	pring("你好!")

但是偏偏又想要带参使用的话,可以在装饰器外层套个壳来接收参数,并提供给壳内的装饰器使用,装饰器代码如下:

装饰器代码
def jujurisdiction_check(I, i):
    """
    权限检测-装饰器
    :param I:检测第I模块
    :param i:检测该模块下的第i个功能
    :param func:
    :return:
    """
    def deco_func(func):
        def inner(self, request):
            username = request.user
            if I == 0:  
                return redirect('/myweb/index')
            jujurisdiction_exist = Jurisdiction.objects.filter(users__contains=username).exists()
            if jujurisdiction_exist:  # request先获取用户,并判断用户是否存在
                jujurisdiction_obj = Jurisdiction.objects.filter(users__contains=username).values_list(
                    "jurisdiction1", "jurisdiction2", "jurisdiction3", "jurisdiction4", "jurisdiction5",
                    "jurisdiction6")  # 获取该用户相关权限(单个账号只有一种权限配置情况的话,可以直接[0]提取)
                pass_code = 0  # 检测码初始化
                for obj in jujurisdiction_obj:  # 遍历该所有配置的权限(使用for而不是[0]是因为项目账号可能存在多个不同权限配置的情况)
                    print("权限检测为:" + obj[I - 1][i])
                    # 这里加减1的逻辑主要在于 系统设置权限是按1234..顺序,而提取数据库数据是0123..
                    if obj[I - 1][0] == obj[I - 1][i] == "1":  # I为哪类权限,需-1; 而i的0号位为大开关,可不用-1;同时为1则为具有权限
                        pass_code = 1
                if pass_code == 1:
                    return func(self, request)  # 继续执行被装饰的函数
                else:
                    return redirect('/myweb/np')  # 跳转至无功能页面
            else:
                return redirect('/myweb/np')
        return inner
    return deco_func

其中Jurisdiction表数据实例为:在这里插入图片描述
每个字段数据的0号位代表大模块功能权限开放状态,1号位及往后表示大模块下的各个小功能开放情况。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值