嵌套路由上的 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 的相关资源