Python 未调用Django Rest框架权限

Python 未调用Django Rest框架权限,python,django,Python,Django,我目前正在将所有视图转换为泛型,因为我喜欢代码变得多么干净。我正在尝试创建我的用户详细信息视图,如下所示: # User.views from Common import view_mixins, view_filters, view_permissions class UserDetail(view_mixins.IntOrStrLookupMixin, generics.RetrieveUpdateDestroyAPIView): queryset = Profile.object

我目前正在将所有视图转换为泛型,因为我喜欢代码变得多么干净。我正在尝试创建我的用户详细信息视图,如下所示:

# User.views

from Common import view_mixins, view_filters, view_permissions

class UserDetail(view_mixins.IntOrStrLookupMixin, generics.RetrieveUpdateDestroyAPIView):
   queryset = Profile.objects.all()

   lookup_fields = ('user__pk', 'user__username')
   lookup_url_kwarg = 'userid'

   filter_backends = (view_filters.ResourceVisibilityFilter, )
   permission_classes = (view_permissions.IsOwnerOrReadOnly, )

   serializer_class = ProfileSerializer

   def update(self, request, *args, **kwargs):
       user = self.get_object()
       return Response('whatever')



所以我的问题是,从来没有请求过许可。我可以让用户很好地使用,但任何人都可以对我试图阻止的内容执行PUT或DELETE操作。

我想我遇到了这个问题。仅当使用get_object()方法获取正在操作的对象时,才会调用对象级权限。使用这一行更新Update(),您将看到正在调用的权限。并更新自定义get_object()以调用超级方法或直接调用权限

class UserDetail(view_mixins.IntOrStrLookupMixin, generics.RetrieveUpdateDestroyAPIView): ... blah blah blah def update(self, request): user = self.get_object() return Response('whatever') class IntOrStrLookupMixin(object): def get_object(self): ... retrieve the object ... self.check_object_permissions(self.request, obj) return obj 类UserDetail(视图\u mixins.IntOrStrLookupMixin,泛型.retrieveUpdatedStroyapView): ... 废话废话 def更新(自我,请求): user=self.get\u对象() 返回响应('whatever') 类IntOrStrLookupMixin(对象): def get_对象(自身): ... 检索对象。。。 self.check\u object\u权限(self.request,obj) 返回obj 编辑:我向DRF团队提交了一份错误报告,他们更新了文档。在文档的权限页面上,它说“当调用.get_Object()时,对象级权限由REST框架的通用视图运行”。我同意这是一件相当微妙的事情,很容易错过


编辑#2:看起来问题不仅在于update()没有调用get#u object(),而且在于IntOrStrLookupMixin mixin重新定义get#u object()方法。更新代码以反映

我想我遇到了这个问题。仅当使用get_object()方法获取正在操作的对象时,才会调用对象级权限。使用这一行更新Update(),您将看到正在调用的权限。并更新自定义get_object()以调用超级方法或直接调用权限

class UserDetail(view_mixins.IntOrStrLookupMixin, generics.RetrieveUpdateDestroyAPIView): ... blah blah blah def update(self, request): user = self.get_object() return Response('whatever') class IntOrStrLookupMixin(object): def get_object(self): ... retrieve the object ... self.check_object_permissions(self.request, obj) return obj 类UserDetail(视图\u mixins.IntOrStrLookupMixin,泛型.retrieveUpdatedStroyapView): ... 废话废话 def更新(自我,请求): user=self.get\u对象() 返回响应('whatever') 类IntOrStrLookupMixin(对象): def get_对象(自身): ... 检索对象。。。 self.check\u object\u权限(self.request,obj) 返回obj 编辑:我向DRF团队提交了一份错误报告,他们更新了文档。在文档的权限页面上,它说“当调用.get_Object()时,对象级权限由REST框架的通用视图运行”。我同意这是一件相当微妙的事情,很容易错过


编辑#2:看起来问题不仅在于update()没有调用get#u object(),而且在于IntOrStrLookupMixin mixin重新定义get#u object()方法。更新代码以反映

在我的mixin中,我必须调用
检查对象权限
方法

class IntOrStrLookupMixin(object):
    """
    Apply to views that can be looked up by slug or pk
    """
    def get_object(self):
        queryset = self.get_queryset()
        queryset = self.filter_queryset(queryset)

        filter = {}

        for field in self.kwargs:
            argument = self.kwargs[field]

            if is_int(argument):
                filter[self.lookup_fields[0]] = argument
            else:
                filter[self.lookup_fields[1]] = argument

        obj = get_object_or_404(queryset, **filter)
        self.check_object_permissions(self.request, obj)

        return obj

在我的mixin中,我必须调用
check\u object\u permissions
方法

class IntOrStrLookupMixin(object):
    """
    Apply to views that can be looked up by slug or pk
    """
    def get_object(self):
        queryset = self.get_queryset()
        queryset = self.filter_queryset(queryset)

        filter = {}

        for field in self.kwargs:
            argument = self.kwargs[field]

            if is_int(argument):
                filter[self.lookup_fields[0]] = argument
            else:
                filter[self.lookup_fields[1]] = argument

        obj = get_object_or_404(queryset, **filter)
        self.check_object_permissions(self.request, obj)

        return obj

还是没什么/抱歉,我的意思是让您更新视图类,而不是权限类。更新了我答案中的密码。是的,还是没什么。我可以编辑来自其他用户的用户,并且控制台中永远不会打印“你给我打电话了吗?”字样。你能用你现在尝试的版本更新代码吗?我很确定这就是问题所在。完成。差别不大,还是没什么/抱歉,我的意思是让您更新视图类,而不是权限类。更新了我答案中的密码。是的,还是没什么。我可以编辑来自其他用户的用户,并且控制台中永远不会打印“你给我打电话了吗?”字样。你能用你现在尝试的版本更新代码吗?我很确定这就是问题所在。完成。其实差别不大。虽然答案本身并不是。。。当我在DRF遇到这样的问题时,我很感激。这是一个非常棒的资源,可以让你轻松地挖掘源代码,并快速浏览以了解每一位是如何协同工作的。哇!这是非常有用的!非常感谢你!虽然不是答案本身。。。当我在DRF遇到这样的问题时,我很感激。这是一个非常棒的资源,可以让你轻松地挖掘源代码,并快速浏览以了解每一位是如何协同工作的。哇!这是非常有用的!非常感谢你!