一般来说,装饰器是直接使用不带参数的:
@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号位及往后表示大模块下的各个小功能开放情况。