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
方法返回falsehas\u object,则不会调用
check\u object\u permission(request,obj)
callshas\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
吗?@zymudhas_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')