Django rest framework queryset自定义权限
Django rest framework queryset custom permissions
我想在我的 django rest 框架视图上使用 django guardian 设置自定义权限。我已经在 RetrieveModelMixin
中成功实现了它,但在 ListModelMixin
中却没有。
我有权限 class 看起来像这样:
class CustomPerm(permissions.BasePermission):
def has_permission(self, request, view):
return request.user and request.user.is_authenticated()
def has_object_permission(self, request, view, object):
if request.method == 'GET':
if object.public is True:
return True
if object.user.is_staff is True:
return True
if 'read_object' in get_perms(request.user, object):
return True
return False
if request.method == 'POST':
#...
我这里也简化了视图:
@authentication_classes((TokenAuthentication, SessionAuthentication, BasicAuthentication,))
@permission_classes((CustomPerm,))
class ObjectView(ListModelMixin,
RetrieveModelMixin,
viewsets.GenericViewSet):
queryset = myObject.objects.all()
serializer_class = ObjectSerializer
我天真地期待的行为:ListModelMixin
可以根据 CustomPerm has_object_permission
规则自行过滤对象。
但它不是那样工作的。我可以通过编写 get_queryset
方法并应用我的自定义权限规则来做我想做的事,但这似乎不合适而且很糟糕。
有没有更好的方法?谢谢:)
PS:我确定我遗漏了什么,我的问题很幼稚,但我看不出是什么。
好吧,覆盖并不可怕,具体取决于您的操作方式...但这不是问题所在。
如果我理解你想要做的是使用你的自定义权限过滤你的查询集。
我的建议是,为了让您的代码明确和简单,像 doc
中那样覆盖您的后端过滤器
但要小心 filter_queryset
应用于 retrieve
和 list
方法
恐怕框架不能那样工作......权限是用来拒绝访问(当满足条件时),而不是为你过滤对象。如果您需要 return 特定对象,则需要根据当前用户在视图(查询集)中过滤它们。
我想在我的 django rest 框架视图上使用 django guardian 设置自定义权限。我已经在 RetrieveModelMixin
中成功实现了它,但在 ListModelMixin
中却没有。
我有权限 class 看起来像这样:
class CustomPerm(permissions.BasePermission):
def has_permission(self, request, view):
return request.user and request.user.is_authenticated()
def has_object_permission(self, request, view, object):
if request.method == 'GET':
if object.public is True:
return True
if object.user.is_staff is True:
return True
if 'read_object' in get_perms(request.user, object):
return True
return False
if request.method == 'POST':
#...
我这里也简化了视图:
@authentication_classes((TokenAuthentication, SessionAuthentication, BasicAuthentication,))
@permission_classes((CustomPerm,))
class ObjectView(ListModelMixin,
RetrieveModelMixin,
viewsets.GenericViewSet):
queryset = myObject.objects.all()
serializer_class = ObjectSerializer
我天真地期待的行为:ListModelMixin
可以根据 CustomPerm has_object_permission
规则自行过滤对象。
但它不是那样工作的。我可以通过编写 get_queryset
方法并应用我的自定义权限规则来做我想做的事,但这似乎不合适而且很糟糕。
有没有更好的方法?谢谢:)
PS:我确定我遗漏了什么,我的问题很幼稚,但我看不出是什么。
好吧,覆盖并不可怕,具体取决于您的操作方式...但这不是问题所在。
如果我理解你想要做的是使用你的自定义权限过滤你的查询集。
我的建议是,为了让您的代码明确和简单,像 doc
中那样覆盖您的后端过滤器但要小心 filter_queryset
应用于 retrieve
和 list
方法
恐怕框架不能那样工作......权限是用来拒绝访问(当满足条件时),而不是为你过滤对象。如果您需要 return 特定对象,则需要根据当前用户在视图(查询集)中过滤它们。