Python Django REST框架:在没有模型级权限的情况下使用对象级权限
我有一个基于API的Django项目 最近,我使用启用了对象级权限。然而,我还没有在我的项目中使用它(直到现在我还没有看到它的任何用途。) 现在,当我在API视图集中打开时Python Django REST框架:在没有模型级权限的情况下使用对象级权限,python,django,django-rest-framework,django-guardian,Python,Django,Django Rest Framework,Django Guardian,我有一个基于API的Django项目 最近,我使用启用了对象级权限。然而,我还没有在我的项目中使用它(直到现在我还没有看到它的任何用途。) 现在,当我在API视图集中打开时 class PhotoViewSet(viewsets.ModelViewSet) permission_classes = (permissions.DjangoObjectPermissions,) 并向端点发出一个更新请求,请求拥有Guardian框架的适当“更改”权限的对象,我得到一个403禁止的响应 这一
class PhotoViewSet(viewsets.ModelViewSet)
permission_classes = (permissions.DjangoObjectPermissions,)
并向端点发出一个更新请求,请求拥有Guardian框架的适当“更改”权限的对象,我得到一个403禁止的
响应
这一反应的原因似乎在于:
djangObjectPermissions
继承自djangModelPermissions
具有\u权限()
失败,因为我没有使用模型级权限djangObjectPermissions
的正确方法是什么
- (A) 实现自定义权限类,从
继承它,并重写djangObjectPermissions
has\u permission()
- (B) 打开Django的模型级权限框架只是为了它
- (C) 使用此黑客跳过检查
djangObjectPermissions
的实现方式要求用户能够编辑模型,并且有权编辑该模型的实例
>>> 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端点列表)。我不会依靠这个来解决您的问题。看起来您在管理检索(admins->admin)中有一个输入错误。模型权限会增加什么样的开销?所谓开销,我指的是比代码开销更多的用户管理开销。您需要创建和管理组,为组分配用户,或者单独管理每个用户的权限。无论哪种方式,如果您的项目不需要这些功能(您只关心应用程序中的对象级权限),那么您将增加额外的复杂性和管理层。