我设置了一个自定义权限类,以便在多个视图中重复使用,其中某些用户代表其他用户拥有类似所有权的权限:
class IsOwnerLike(permissions.BasePermission):
def has_permission(self, request, view):
if (
user_is_owner(request.user, request.data["owned_by"])
| user_is_owner_like(request.user, request.data["owned_by"])
):
return True
return False
这对于一个模型视图集按预期工作。
但是,由于遗留原因,进入不同视图的不同请求可能没有"owned_by"数据元素 - 它可能被称为"拥有","所有者","created_by"等 - 因此我不能重用这个自定义权限。
在视图集中抽象内容、规范化传递给自定义权限类的数据的正确方法是什么?是否可以执行此操作,或者我应该考虑以不同的方式处理这些权限?
找到了一个解决方案。
我能够向视图添加自定义属性:
class ViewOne(ModelViewSet):
ownership_fieldname = "owned_by"
permission_classes = [IsOwnerLike]
...
class ViewTwo(ModelViewSet):
ownership_fieldname = "owner"
permission_classes = [IsOwnerLike]
...
然后在权限中访问它:
class IsOwnerLike(permissions.BasePermission):
def has_permission(self, request, view):
if (
user_is_owner(request.user, request.data[view.ownership_fieldname])
| user_is_owner_like(request.user, request.data[view.ownership_fieldname])
):
return True
return False
您应该使用 from has_object_permission for 对象检查模型访问权限,如下所示:
def has_object_permission(self, request, view, obj):
if hasattr(obj, 'owner'):
if obj.user == request.user:
return True
return False
您可以使用模型所有者字段名称更改所有者
对于将所有者 kwargs 传递给权限类,您应该编写自定义模型视图集和从模型视图集继承并覆盖 get_permissions(( 方法