【问题标题】:Django Rest Framework: can't get user id from given tokenDjango Rest Framework:无法从给定令牌中获取用户 ID
【发布时间】:2019-05-08 06:41:57
【问题描述】:

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

我使用的 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.

现在,我已经验证了我用来测试它的令牌在数据库中,并且它们具有有效的 user_id。此外,我验证了我从 HTTP 请求中读取的令牌也是正确的。 我做错了吗?

【问题讨论】:

  • 使用request.META.get('HTTP_AUTHORIZATION'),您可能会得到一个字符串,例如Token YoUrToKeN。您需要拆分此字符串并提取令牌。

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


【解决方案1】:

在我的例子中,我认为错误是因为之前没有创建令牌。将 .get 交换为 .get_or_create 即可工作。

【讨论】:

    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-10
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2013-09-08
      • 2018-02-12
      • 2019-07-23
      相关资源
      最近更新 更多