【问题标题】:Django REST Permissions on Nested Routes嵌套路由上的 Django REST 权限
【发布时间】:2014-08-14 04:46:26
【问题描述】:

我正在使用带有nested router extension 的Django REST 框架。我的一条路线如下所示:companies/$company/locations/$location 其中$company$location 是slug 变量。

我希望允许用户发布到此 URL:companies/$company/locations/ 以添加新位置。我想确保执行 POST 的用户对他正在发布的公司具有更正权限。我目前使用django-guardian 作为我的对象级权限。 POST 消息仅包含新位置的名称,它不包含可以从 URL 推断出的公司名称。 在这种情况下,我很难正确执行权限。我一直在从视图集的 pre_save 方法中设置新的 Location 对象的 company 字段,但这对于应用权限检查来说为时已晚。

执行此操作的最佳方法是什么?

如果用户确实在 POST 中包含公司,我可以通过将以下内容添加到视图集中来验证公司:

def get_queryset(self):
    parent = super(LocationViewSet, self).get_queryset()    
    return parent.filter(company__slug=self.kwargs['company_slug'])

【问题讨论】:

  • 您找到解决方案了吗?
  • @alex 你是如何在 pre_save 方法中获得公司信息的?我也在寻找您实际问题的答案
  • 你能发布网址和视图和序列化程序吗?

标签: django django-rest-framework nested-routes django-guardian


【解决方案1】:

好吧,我实际上找到了一种相当丑陋的方法来执行此操作,检索父对象并根据请求的用户检查它是否属于。

def create(self, request, *args, **kwargs):
    request.data['catspad'] = kwargs['catspad_pk']
    if not Catspad.objects.get(id=kwargs['catspad_pk']).owner == request.user:
        return Response(status=HTTP_401_UNAUTHORIZED)
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    self.perform_create(serializer)
    headers = self.get_success_headers(serializer.data)
    return Response(serializer.data, status=HTTP_201_CREATED, headers=headers)

【讨论】:

    猜你喜欢
    • 2011-10-10
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多