在视图中定义权限后,我想始终检查发出请求的用户是否具有该权限。
假设我有一个基本的权限检查,如下所示:
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
类。
答案 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,)