我有一个Django项目,该项目使用基于Django REST框架的API。
最近,我使用django-guardian启用了对象级权限。然而,我还没有在我的项目中使用模型级权限框架(直到现在我还没有看到任何目的。)
现在,当我在我的API视图集中打开DjangoObjectPermissions时,
class PhotoViewSet(viewsets.ModelViewSet)
permission_classes = (permissions.DjangoObjectPermissions,)
并从Guardian框架向具有适当"更改"权限的对象的端点发出更新请求,我得到了403 FORBIDDEN
响应。
这种响应的原因似乎在于请求调度阶段:
- 在这种情况下,DRF会检查模型权限
- CCD_ 2继承自CCD_ 3
- DRF调用
DjangoObjectPermissions.has_permission()
has_permission()
失败,因为我没有使用模型级别的权限
在我的情况下,使用DjangoObjectPermissions
的正确方法是什么?
- (A) 实现一个自定义权限类,从
DjangoObjectPermissions
继承并重写has_permission()
- (B) 打开Django的模型级权限框架就是为了它
- (C) 使用此
破解解决方法跳过检查
DjangoObjectPermissions
的实现方式期望用户能够编辑模型,并拥有编辑该模型实例的权限。
>>> from django.contrib.auth.models import User, Group
>>> user = User.objects.get(pk=1)
>>> admins = Group.objects.get(pk=1)
>>> user.has_perm('change_group')
False
>>> user.has_perm('change_group', admins)
True
管理模型权限可能会给项目增加(用户管理)开销。我建议只有当你对项目的其余部分有要求并计划使用它时,才走这条路
相反,创建一个完全符合您需求的自定义权限类似乎是最好的选择。它可以简单到:
class ObjectOnlyPermissions(DjangoObjectPermissions):
def has_permission(self, request, view):
return True
您引用的解决方法没有文档,看起来是为了解决内部问题(正在筛选APIRootView端点列表)。我不会靠这个来解决你的问题。