DRF:始终应用默认权限类

时间:2019-08-28 15:29:13

标签: django django-rest-framework permissions

在视图中定义权限后,我想始终检查发出请求的用户是否具有该权限。

假设我有一个基本的权限检查,如下所示:

class HasPermission(permissions.BasePermission):

    def has_permission(self, request, view, obj=None):
        if hasattr(view, 'permission_required'):
            return request.user.has_perm(view.permission_required)
        return True

我已将其添加为我的settings中的默认权限:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    'DEFAULT_PERMISSION_CLASSES': [
        'apps.api.permissions.HasPermission'
    ],
}

这有效,但是一旦我在视图中定义permission_classes,默认值就会被覆盖。是否有任何清洁正确的方法?我可能只写了一个Mixin,然后在dispatch内做同样的事情,但是想使用推荐的Permission类。

2 个答案:

答案 0 :(得分:0)

permissions属性带有一个类列表,因此您只需包含默认值即可。

def LongestIncreasingSubsequenceMemo(nums, i, cache):
    if cache[i] > 0:
        return cache[i]
    result = 1
    for j in range(i):
        if nums[i] > nums[j]:
            result = max(result, 1 + LongestIncreasingSubsequenceMemo(nums, j, cache))
    cache[i] = result
    return result

def main():
    nums = [1,2,3,4,5]
    if not nums:
        return 0        
    n = len(nums)
    cache = [0 for i in range(n)]
    result = 1
    for i in range(n):
        result = max(result, LongestIncreasingSubsequenceMemo(nums, i, cache))
    return result

if __name__ == "__main__":
    print(main())

答案 1 :(得分:0)

DEFAULT_PERMISSION_CLASSES仅在您未在视图集中声明permission_classes时应用。

如果您没有其他需要应用的权限类别,只需从视图集中排除permission_classes,那样它将始终使用默认权限。

如果有一段时间,您将需要使用其他权限类以及默认权限类。

例如

class HasPermission(permissions.BasePermission):

    def has_permission(self, request, view, obj=None):
        if hasattr(view, 'permission_required'):
            return request.user.has_perm(view.permission_required)
        return True

class AnotherPermissionClass(..):
    ....

总是需要应用HasPermission,有时还需要应用AnotherPermissionClass`。

如果是这种情况,则只需继承HasPermission作为AnotherPermissionClass的基类即可。


AnotherPermissionClass(apps.api.permissions.HasPermission)
     def has_permmision(self, request, view, obj=None):
         has_base_perm = super().has_permmision(request, view, obj=obj)
         ...

class ViewsetA(...):
     ...

     # Don't declare permission_classes at all and it will use the settings default


class ViewsetB(...):
     permission_classes = (AnotherPermissionClass,)
相关问题