【问题标题】:Django Rest Framework permission_classDjango Rest 框架权限类
【发布时间】:2016-11-20 18:02:56
【问题描述】:

我是 DRF 的新手,当我尝试在 DRF 中自定义 Permission 时遇到了以下问题。

假设我的 permissions.py 文件中有以下代码:

class GetPermission(BasePermission):
    obj_attr  = 'POITS'

    def has_permission(self, request, view):
        user = request.user
        employee = Employee.objects.get(user=user)
        # Return a dict which indicates whether the request user has the corresponding permissions
        permissions = get_permission(employee.id)
        return permissions[GetPermission.obj_attr]

在我看来,我想覆盖 GetPermission 类中的静态变量:

class AssignmentList(generics.ListCreateAPIView):
    GetPermission.obj_attr = 'ASSIGNMENT'
    permission_classes = (IsAuthenticated, IsStaff, GetPermission)
    queryset = Assignment.objects.all()
    serializer_class = AssignmentSerializer
    pagination_class = LargeResultsSetPagination

    def perform_create(self, serializer):
        employee = Employee.objects.get(user=self.request.user)
        serializer.save(sender=employee, status=0, operatable=0)

但是,正如 DRF 的文档指出的那样:

权限检查总是在视图的最开始运行,在任何其他代码被允许继续之前。

那么我该怎么做,提前谢谢,任何想法都会受到欢迎,因为我是 DRF 的新鱼。

【问题讨论】:

  • 我不明白你的问题。该权限类如何与在视图开始时运行不兼容?
  • 对于不同的视图,我想使用具有不同 obj_attr 值的 GetPermission 类。

标签: python django rest permissions django-rest-framework


【解决方案1】:

您需要为每个属性创建权限的子类,并在has_permission 方法中使用self.obj_attr

class DefaultPermission(GetPermission):
    obj_attr = 'POITS'

class AssignmentPermission(GetPermission):
    obj_attr = 'ASSIGNMENT'

【讨论】:

  • 我得到了一堆权限属性,这意味着我需要为每个属性设置很多子类?我想知道是否有更好的方法。
猜你喜欢
  • 2017-04-13
  • 2014-08-25
  • 2016-01-25
  • 1970-01-01
  • 2019-07-13
  • 2018-11-19
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多