Django Rest Framework:无法从给定令牌获取用户ID

时间:2018-12-06 14:28:25

标签: django python-3.x postgresql django-rest-framework

我正在处理我的第一个Django项目。我正在尝试创建一个通过发布请求接受令牌的api,并在public_authtoken_token表中查询相关的用户ID。

我正在使用的dbms是PostgreSQL 10.6。 Django版本是2.1.1,DRF是3.8.2

这是我拥有的“查看”代码:

from rest_framework.authtoken.models import Token
from rest_framework.views import APIView

class MyView(APIView):

    def post(self, request, format=None):

        my_token = request.META.get('HTTP_AUTHORIZATION')
        user_id = Token.objects.get(key=my_token).user_id
        return Response(status=status.HTTP_200_OK)

我的问题是我这样做时遇到以下异常

user_id = Token.objects.get(key=http_token).user_id

rest_framework.authtoken.models.Token.DoesNotExist: Token matching query does not exist.

现在,我已经验证了用于测试它的令牌在db中,并且它们具有有效的user_id。另外,我还验证了从HTTP请求读取的令牌也是正确的。 我在做错什么吗?

2 个答案:

答案 0 :(得分:2)

如果您调试并看到您正在使用request.META.get('HTTP_AUTHORIZATION')检索的值,您会注意到它是这样的:

JWT eyJhbGciOiAiSFMyNTYiLCAidHlwIj

根据django rest的身份验证后端,该值和前缀将有所不同。但是您只需使用以下代码即可解决此错误:

from rest_framework.authtoken.models import Token
from rest_framework.views import APIView

class MyView(APIView):

    def post(self, request, format=None):
        my_token = request.META.get('HTTP_AUTHORIZATION').split()[1]
        user_id = Token.objects.get(key=my_token).user_id
        return Response(status=status.HTTP_200_OK)

答案 1 :(得分:0)

就我而言,我认为错误是因为令牌不是事先创建的。将 .get 交换为 .get_or_create 使其正常工作。