我正在处理我的第一个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请求读取的令牌也是正确的。 我在做错什么吗?
答案 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
使其正常工作。