“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 可序列化的