django rest框架对象权限

django rest框架对象权限,django,django-rest-framework,Django,Django Rest Framework,我似乎没有触发has\u object\u permission功能 class MyPermission(DefaultPermission): def has_permission(self, request, view): return request.user.is_superuser def has_object_permission(self, request, view, obj): import pdb;pdb.set_trace

我似乎没有触发
has\u object\u permission
功能

class MyPermission(DefaultPermission):
    def has_permission(self, request, view):
        return request.user.is_superuser

    def has_object_permission(self, request, view, obj):
        import pdb;pdb.set_trace()
        return request.user == obj.submitter
转到
mydomain.com/api/mymodel/100
,应该考虑访问对象,对吗?我正在这里查看对象
100
。为什么我的
trace()
没有被提取

看法
权限不起作用,因为check\u object\u permissions方法仅在get\u object函数中调用。因此,您应该在视图中调用该函数:

def check(self, request, pk=None):
    obj = self.get_object()
或者您可以直接在decorator中添加权限

范例

    class MyViewSet(ModelViewSet):
        queryset = MyModel.objects.all()
        ....
        permission_classes = (MyPermission, )


        @detail_route(methods=['GET', ])
        def custom(self, request, pk=None):
            my_obj = self.get_object() # do this and your permissions shall be checked
            return Response('whatever')

注意:仅当视图级别已通过权限检查时,才会调用实例级别的has\u object\u权限方法。还要注意,为了运行实例级检查,视图代码应该显式调用.check\u object\u权限(request,obj)。如果您使用的是通用视图,则默认情况下将为您处理此问题


在DRF中,常规视图
检查权限(请求)
总是在每个请求中调用,因为它在分派方法中

check\u permissions
方法从权限类收集所有权限并检查每个权限。如果任何权限返回false,该方法将引发异常

因此,如果您的
has\u permission
方法返回false
has\u object,则不会调用

check\u object\u permission(request,obj)
calls
has\u object\u permission
方法对每个权限类进行调用。它在
get_object
方法中调用

因此,规则是,如果所有权限类的
has\u permission
返回true,则只有
has\u object\u permission
被选中

class MyPermission(默认权限):
def具有_权限(自我、请求、查看):
#检查请求是否针对单个对象
如果view.kwargs中的view.lookup\u url\u kwarg:
返回真值
return request.user.is_superuser
def具有对象权限(自我、请求、查看、obj):
进口pdb;pdb.set_trace()
return request.user==obj.submitter

您确定在测试期间
has_permission
返回了
True
吗?@zymud
has_permissions
没有返回True,但这是我想要的,对吗?用户可以编辑自己的记录,但所有记录的视图集不应该对用户可用。应该在哪里
def check()
go?check()是一个示例视图,您需要的是,
obj=self.get\u object()
,此函数触发check\u object\u permissions(),或者您可以调用object.check\u object\u permissions()我还是不明白。obj=self.get\u object()应该去哪里?内部
具有\u权限()
?不,不是内部权限。。。它应该放在视图中,比如'def view_name(这是一种方式。或者你可以设置权限_classes=(MyPermission),)现在呢?你明白我说的了吗?很抱歉让你感到困惑很好的答案,我一直想表达的,你说的很简单。
    class MyViewSet(ModelViewSet):
        queryset = MyModel.objects.all()
        ....
        permission_classes = (MyPermission, )


        @detail_route(methods=['GET', ])
        def custom(self, request, pk=None):
            my_obj = self.get_object() # do this and your permissions shall be checked
            return Response('whatever')