可以在django中使用装饰器来根据视图参数进行权限吗?

jke*_*esh 6 django permissions decorator

我不确定这是可能的,但有没有办法写出类似的东西

@group_required('group_id')
def myview(request, group_id):
    .....
Run Code Online (Sandbox Code Playgroud)

我在哪里查看参数group_id的值,并将此视图的访问权限仅限于此组中的人员?

我知道可以创建一个装饰器来检查某个特定组的成员资格

@group_required('admin')
def myview(request):
   ....
Run Code Online (Sandbox Code Playgroud)

但是我想要一个只能由某个组内的人访问的视图,这个视图由网址决定.

所以举个例子

/group/1
/group/2
Run Code Online (Sandbox Code Playgroud)

每个人都应该拥有权限,以便只有#X组的成员才能看到该页面.我可以在视图中轻松编写此功能

group = get group
if user not in group
    raise 404
Run Code Online (Sandbox Code Playgroud)

但这种逻辑在全世界都在重复.装饰者似乎是一种很有前途的方式,但似乎范围是倒退的.还有另一种处理此类权限的首选方法吗?

谢谢!

Dan*_*man 5

装饰器可以访问所有视图参数,所以这绝对是可能的。你可以这样做:

def group_required(arg_name):
    def decorator(view):
        def wrapper(request, *args, **kwargs):
            group_id = kwargs.get(arg_name)
            user = request.user
            if group_id in user.groups.values_list('id', flat=True):
                return view(request, *args, **kwargs)
            else:
                return HttpResponseForbidden # 403 Forbidden is better than 404
        return wrapper
    return decorator
Run Code Online (Sandbox Code Playgroud)

(如果您不需要在装饰器中动态定义参数的灵活性,例如,如果您总是调用它group_id,那么您可以在这里错过外部函数并只使用kwargs.get('group_id')。)