有一个标准的ViewSet,网址如下:/ api / users /和/ api / users / {pk} /。我希望/ api / users / me /的行为与pk访问的详细视图完全相同(所以/ api / users / me /表现得像/ api / users / 5 /如果你的用户ID是5)。
我试过这个:
def dispatch(self, request, *args, **kwargs):
if kwargs.get('pk') == 'me' and request.user:
kwargs['pk'] = request.user.pk
return super(UserViewSet, self).dispatch(request, *args, **kwargs)
而且,它与SessionAuthentication完美配合(所有HTTP方法)但与TokenAuthentication无效。使用TokenAuthentication,它返回:
curl -H "Authorization: Token f14b876aa54ebb7679330b88ea1c5b5ea4d693e9" http://127.0.0.1:8000/api/users/me/
{"detail":"Not found."}
而且,dispatch()甚至没有被执行,所以早些时候必须阻止它。其他视图(例如/ api / users /)正常工作。可能是什么原因,如何调试?
答案 0 :(得分:1)
我最终使用了更优雅的东西:
def get_object(self):
if self.kwargs['pk'] == 'me':
return self.request.user
else:
return super().get_object()
为什么最初的想法适用于SessionAuthentication而不是TokenAuthentication仍然是个谜。