美文网首页
drf中has_permission和has_object_pe

drf中has_permission和has_object_pe

作者: mutang | 来源:发表于2020-12-09 21:15 被阅读0次

贴源码:

class BasePermission(metaclass=BasePermissionMetaclass):
    """
    A base class from which all permission classes should inherit.
    所有权限类都应该继承的基类。
    """

    def has_permission(self, request, view):
        """
        Return `True` if permission is granted, `False` otherwise.
        """
        return True

    def has_object_permission(self, request, view, obj):
        """
        Return `True` if permission is granted, `False` otherwise.
        """
        return True

是我没找对,源码没看头,再找上层还是没看头,官方文档看起来晦涩难懂。只有不断试错,才知道正解

自定义权限类:

class IsLeaderAndOwnerUserPermission(permissions.BasePermission):

    def has_permission(self, request, view):
        print('saaaaaaaaaa')
        # if not request.user.pid:
        #   '''组长'''
        #   return True
        # else:
        #   return False
        # if request.method in permissions.SAFE_METHODS:
        #   return True
        return False

    def has_object_permission(self, request, view, obj):
        # if request.method in permissions.SAFE_METHODS:
        #   return True
        #
        print('ooooooooooooo')
        print(request.user.id)
        print(obj,type(obj))
        return True

我的理解:

1. 访问列表时,只执行has_permission,不执行has_object_permission
2.访问对象时,首先执行has_permission,
当返回True时,再执行has_object_permission;
当返回False时,has_object_permission不再执行

我的使用策略:

我建议大家去官网看,仅记录个人使用心得,环境:

Django==3.0.6

djangorestframework==3.11.0

  1. 当访问列表需要限制时,用过滤器:

        def get_queryset(self):
            user = self.request.user
            stream = self.request.stream.path
            id =  stream.split('/')[-2]
            if not id.isdigit():#不带ID
                if not user.pid:
                    '''组长'''
                    return UserInfo.objects.filter(pid=user.id)
                else:
                    return UserInfo.objects.filter(userinfo=user)
            else:
                '''拷贝源码'''
                queryset = self.queryset
                if isinstance(queryset, QuerySet):
                    # Ensure queryset is re-evaluated on each request.
                    queryset = queryset.all()
                return queryset
    
  2. 访问对象时,权限可以用过滤器,也可以用has_object_permission

相关文章

网友评论

      本文标题:drf中has_permission和has_object_pe

      本文链接:https://www.haomeiwen.com/subject/zgjkgktx.html