如何解决TypeError: function()参数'code'必须是code而非str错误?
解决Django REST Framework自定义认证视图的TypeError错误
错误根源
obtain_auth_token是函数视图,并非类视图,直接用类继承它会触发TypeError: function() argument 'code' must be code, not str错误。此外代码还有两处小问题:
- 未导入
Response类 serializer.validated_data的键应为小写'user',而非大写'User'
正确实现方式
方式一:基于APIView编写类视图
这是最规范的类视图实现方式:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.authtoken.serializers import AuthTokenSerializer from rest_framework.authtoken.models import Token from rest_framework import status class UserAuthentication(APIView): def post(self, request, *args, **kwargs): serializer = AuthTokenSerializer(data=request.data, context={'request': request}) serializer.is_valid(raise_exception=True) user = serializer.validated_data['user'] token, created = Token.objects.get_or_create(user=user) return Response({'token': token.key}, status=status.HTTP_200_OK)
方式二:复用obtain_auth_token的函数视图
如果想保留原obtain_auth_token的逻辑,可通过函数包装实现自定义:
from rest_framework.authtoken.views import obtain_auth_token from rest_framework.response import Response from rest_framework.authtoken.models import Token def custom_obtain_auth_token(request): # 调用原认证视图获取响应 response = obtain_auth_token(request) token_key = response.data['token'] # 可在此添加自定义逻辑,比如获取用户信息 user = Token.objects.get(key=token_key).user return Response({'token': token_key})
关键修正点
- 类视图必须继承DRF的
APIView或其子类,而非函数视图 - 确保导入
Response类用于返回响应 - 从
serializer.validated_data中获取用户时使用小写键'user'
内容的提问来源于stack exchange,提问作者Avinash Srivastava
相关产品推荐
相关产品推荐

