如何在Django REST Framework登录API中扩展返回字段(含AuthToken与用户邮箱)
解决方案:在DRF登录接口中同时返回AuthToken和用户字段
嘿,这个需求其实超容易实现,只需要对现有的CreateTokenView做一点点修改就行,不用动太多代码。默认的ObtainAuthToken视图只会返回token,我们只需要重写它的post方法,在验证成功后把用户的邮箱(以及其他你需要的字段)一起塞进响应里就好。
具体修改步骤:
- 导入Token模型:首先在你的视图文件顶部,导入DRF的Token模型:
from rest_framework.authtoken.models import Token
- 重写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
相关产品推荐
相关产品推荐

