You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django REST Framework登录API中扩展返回字段(含AuthToken与用户邮箱)

解决方案:在DRF登录接口中同时返回AuthToken和用户字段

嘿,这个需求其实超容易实现,只需要对现有的CreateTokenView做一点点修改就行,不用动太多代码。默认的ObtainAuthToken视图只会返回token,我们只需要重写它的post方法,在验证成功后把用户的邮箱(以及其他你需要的字段)一起塞进响应里就好。

具体修改步骤:

  1. 导入Token模型:首先在你的视图文件顶部,导入DRF的Token模型:
from rest_framework.authtoken.models import Token
  1. 重写CreateTokenView的post方法:修改你现有的CreateTokenView,重写post方法来构造包含用户字段的响应:
class CreateTokenView(ObtainAuthToken):
    serializer_class = AuthTokenSerializer
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES

    def post(self, request, *args, **kwargs):
        # 调用父类的验证逻辑
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        # 从验证后的 data 中获取用户对象
        user = serializer.validated_data['user']
        # 获取或创建用户的AuthToken
        token, created = Token.objects.get_or_create(user=user)
        # 构造包含token和用户字段的响应
        return Response({
            'token': token.key,
            'email': user.email,
            'username': user.username,
            'name': user.name  # 如果需要其他字段,直接在这里添加就行
        })

修改后的完整视图代码:

from rest_framework.authtoken.models import Token
from rest_framework import generics, authentication, permissions
from rest_framework.settings import api_settings
from rest_framework.response import Response
from .serializers import UserSerializer, AuthTokenSerializer

class CreateUserView(generics.CreateAPIView):
    serializer_class = UserSerializer

class CreateTokenView(ObtainAuthToken):
    serializer_class = AuthTokenSerializer
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        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,
            'email': user.email,
            'username': user.username,
            'name': user.name
        })

class ManageUserView(generics.RetrieveAPIView):
    serializer_class = UserSerializer
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)

    def get_object(self):
        return self.request.user

为什么这样做?

你的AuthTokenSerializer已经正确完成了用户验证的逻辑,并把验证通过的user对象放进了validated_data里,我们只需要在视图中取出这个用户对象,把需要的字段(比如email、username等)和token一起返回给客户端就可以了。这种方式代码改动极少,完全符合你“少量代码修改”的需求。

现在当用户登录验证成功后,客户端收到的响应会是这样的:

{
    "token": "9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b",
    "email": "user@example.com",
    "username": "testuser",
    "name": "Test User"
}

内容的提问来源于stack exchange,提问作者Mohsen Amiri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 08:47:44