Django REST API通过Token获取用户信息报错问题排查
Django REST API Token获取用户信息的错误排查与修复
核心错误分析
- 序列化器使用逻辑混乱:你已经配置了
TokenAuthentication和IsAuthenticated权限,只要请求携带有效Token,request.user就是已认证通过的用户,完全不需要再通过序列化器解析token、重新获取用户。视图里serializer = UserSerializer(data=request.user)把User对象传给data参数是错误的——data仅接收字典类型数据,且这套逻辑和当前认证流程完全脱节。 - 序列化器定义错误:
- 拼写错误:
acess_token应为access_token - 冗余设计:继承
Serializer却添加Meta类指定Model,正确做法是用ModelSerializer简化用户模型序列化 - 多余字段:
acess_token字段完全没必要,Token认证已由DRF认证中间件处理,序列化器无需额外定义该字段
- 拼写错误:
- 冗余用户获取逻辑:视图中调用
jwt.get_user属于画蛇添足,认证通过后request.user就是当前合法用户。
修正后的代码
1. 序列化器修正
from rest_framework import serializers from django.contrib.auth.models import User class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ["id", "username", "email"]
2. 视图修正
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from rest_framework.authentication import TokenAuthentication from .serializers import UserSerializer class getUserInfoView(APIView): permission_classes = [IsAuthenticated] authentication_classes = [TokenAuthentication] def get(self, request): # 直接序列化已认证的当前用户 serializer = UserSerializer(request.user) return Response(serializer.data)
3. URL配置保持不变
path('api/me/', getUserInfoView.as_view(), name='Personal-Information')
验证步骤
- 确保已为目标用户生成Token(可通过DRF自带的
obtain_auth_token视图获取) - 请求
/api/me/时,在请求头中携带Authorization: Token <你的用户Token> - 此时会正确返回当前认证用户的id、username和email信息
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

