嵌套路由上的 Django REST 权限

Posted

技术标签:

【中文标题】嵌套路由上的 Django REST 权限【英文标题】:Django REST Permissions on Nested Routes 【发布时间】: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 方法中获得公司信息的?我也在寻找您实际问题的答案 你能发布网址和视图和序列化程序吗? 【参考方案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)

【讨论】:

以上是关于嵌套路由上的 Django REST 权限的主要内容,如果未能解决你的问题,请参考以下文章

在 Django Rest Framework 中使用 APIView 和 viewset 设置路由器

multi-tenant-schemas:使用django rest框架的动态api路由

Django Rest Framework 中嵌套 URL 的相关资源

Django、REST 和 Angular 路由

为典型的 REST 实现嵌套 Ktor 路由匹配器和处理程序的正确方法是啥?

django rest框架动态url路由