首页 > 解决方案 > Django Rest Framework get_permissions 需要一个或其他权限

问题描述

我已经在 ListCreateAPIView 上定义了 get_permissions 方法并在那里应用了自定义权限,但我有一个问题。

class ListSchoolStudents(generics.ListCreateAPIView, TeacherPermission):
    serializer_class = StudentSerializerForList
    permission_classes = [IsAuthenticated & TeacherPermission]
    
    def get_queryset(self):
        pk = self.kwargs['pk']
        
        return Student.objects.filter(school__id = pk).select_related('school','school_class').prefetch_related('subject')

    def get_permissions(self):
        if self.request.method in ['POST']:
            
            return [PrincipalPermission()]
        
        return [permissions.IsAuthenticated(), TeacherPermission()]

当我像这样定义它时,Principal 只能使用 POST 方法。但我也希望该用户能够使用其他方法。我尝试过这样的事情:

def get_permissions(self):
        if self.request.method in ['POST']:
            return [PrincipalPermission()]
        return [permissions.IsAuthenticated(), TeacherPermission(), PrincipalPermission() ]

但据我了解,它需要满足列表中的所有权限。

我正在寻找这样的东西

return [permissions.IsAuthenticated(), TeacherPermission() or PrincipalPermission() ]

我知道这种可能性存在于 permission_classes 通过写作

permission_classes = [IsAuthenticated | TeacherPermission]

有没有一种简单的方法可以做到这一点,或者如果用户是教师或校长,我被迫编写另一个自定义权限来授予权限?

标签: pythondjangorestdjango-rest-frameworkpermissions

解决方案


如您提供的示例所示,|应应用于类,因此:

return [permissions.IsAuthenticated(), (TeacherPermission | PrincipalPermission)() ]

但是,有一种方法可以简化这一点,利用 the@property和 simple 属性与外部无法区分的事实。我会推荐这种模式作为覆盖get_permissions方法的替代品。

class ListSchoolStudents(generics.ListCreateAPIView, TeacherPermission):
    serializer_class = StudentSerializerForList

    @property
    def permission_classes(self):
        if self.request.method in ['POST']:
            return [PrincipalPermission]
        return [IsAuthenticated, TeacherPermission | PrincipalPermission]

推荐阅读