【问题标题】:Object of type 'AuthToken' is not JSON serializable“AuthToken”类型的对象不是 JSON 可序列化的
【发布时间】:2019-09-04 04:58:40
【问题描述】:

创建令牌时出现上述错误,代码如下:

from rest_framework import generics, permissions
from rest_framework.response import Response 
from knox.models import AuthToken
from .serializers import UserSerializer, RegisterSerializer

class RegisterAPI(generics.GenericAPIView):
    serializer_class = RegisterSerializer

def post(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = serializer.save()
    return Response({
        "user": UserSerializer(user, context=self.get_serializer_context()).data,
        "token": AuthToken.objects.create(user)
    })

我在这里做错了什么

【问题讨论】:

  • 好吧,您还需要序列化 ​​AuthToken,就像您对用户所做的那样(或传递可以转换为 JSON 的令牌属性(如 str、@987654324 @ 等)。AuthToken 本身至少在没有一些额外逻辑的情况下是可序列化的)。
  • 如何序列化AuthToken?
  • 使用序列化程序,就像使用 UserSerializer 一样。
  • 好的,知道了,它是一个不能序列化的元组,这样做是有效的 AuthToken.objects.create(user)[1]。
  • 这似乎是django-rest-knox 的变化。我有一个django-rest-know v 3.6.0 使用您在帖子中的代码的项目。我刚刚开始一个新项目(使用版本 4.0.1),我不得不将 [1] 添加到令牌序列化中。

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


【解决方案1】:

Token.objects.create 返回一个元组(实例,令牌)。因此,为了获得令牌,请使用索引 1

"token": AuthToken.objects.create(user)[1]

【讨论】:

  • 但这是我们需要使用的真正令牌。我的意思是当我们打印 AuthToken.objects.create(user) 时,它会给出这样的输出; (, 'another_token') 当我检查数据库时,“long_token”存储在数据库中,而不是“another_token”,但您使用的方法返回“another_token”。
【解决方案2】:

更好的方法是在python中使用这个方法

_, token = AuthToken.objects.create(user)
return Response({
    "user": UserSerializer(user, context=self.get_serializer_context()).data,
    "token": token
})

【讨论】:

    【解决方案3】:

    发生此特定错误是因为 Token.objects.create 返回一个元组(实例,令牌)。只需使用第二个位置 [1] 而不是前者

    "token": AuthToken.objects.create(user)[1]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2021-07-04
      • 2021-12-10
      • 1970-01-01
      • 2021-09-27
      • 2019-01-12
      • 2019-03-27
      相关资源
      最近更新 更多