“AuthToken”类型的对象不是 JSON 可序列化的

Posted

技术标签:

【中文标题】“AuthToken”类型的对象不是 JSON 可序列化的【英文标题】:Object of type 'AuthToken' is not JSON serializable 【发布时间】: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] 添加到令牌序列化中。 【参考方案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]

【讨论】:

以上是关于“AuthToken”类型的对象不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章

“Mycart”类型的对象在 Django 中不是 JSON 可序列化的

Python 错误:TypeError:'Timestamp' 类型的对象不是 JSON 可序列化的'

Celery EncodeError(TypeError('响应类型的对象不是 JSON 可序列化的'))

TypeError:mappingproxy 类型的对象不是 JSON 可序列化的

Flask API TypeError:“响应”类型的对象不是 JSON 可序列化的

“TypeError”类型的对象不是 JSON 可序列化的