我有一个基于 Django REST framework 的带有 API 的 Django 项目。
最近我使用 django-guardian 启用了对象级权限。但是我还没有在我的项目中使用 model-level permissions framework (直到这一刻我没有看到任何目的。)
现在,当我在 API View 集中打开 DjangoObjectPermissions 时,
class PhotoViewSet(viewsets.ModelViewSet)
permission_classes = (permissions.DjangoObjectPermissions,)
并向端点发出来自 Guardian 框架的具有适当“更改”权限的对象的更新请求,我收到
403 FORBIDDEN
响应。此响应的原因似乎在于 request dispatch stage :
在这种情况下,
DjangoObjectPermissions
继承自 DjangoModelPermissions
。 DjangoObjectPermissions.has_permission()
has_permission()
失败,因为我没有使用模型级权限。 在我的情况下使用
DjangoObjectPermissions
的正确方法是什么?DjangoObjectPermissions
继承并覆盖 has_permission()
。 最佳答案
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)。它可以很简单:
class ObjectOnlyPermissions(DjangoObjectPermissions):
def has_permission(self, request, view):
return True
您引用的解决方法没有记录,看起来是为了解决内部问题(APIRootView 端点列表被过滤)。我不会依靠这个来解决你的问题。
关于python - Django REST 框架 : using object-level permissions without model-level permissions,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34371409/