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

如何在Django DRF中使用Serializer实现登出功能?

DRF 登出功能实现方案

首先要明确:你的现有登录视图仅完成了用户验证,没有生成并返回认证凭证(比如Token),而登出的核心是销毁这个凭证。下面是完整的实现步骤:

1. 先完善登录逻辑(必须)

要实现登出,首先得让登录返回有效的认证Token。修改views.py中的LoginView:

from rest_framework.authtoken.models import Token  # 新增导入

class LoginView(views.APIView):
    def post(self, request):
        serializer = UserLoginSerializer(data=request.data)

        if serializer.is_valid():
            user = serializer.validated_data
            # 为用户生成或获取已存在的Token
            token, created = Token.objects.get_or_create(user=user)
            return Response({
                'message': "登录成功",
                'data': {
                    'user_id': user.id,
                    'username': user.username,
                    'token': token.key  # 返回Token给前端
                }
            })
        return Response({'message': "登录失败", 'errors': serializer.errors})

2. 补全登出序列化器(Serializers.py)

登出不需要前端传递额外数据,只需要验证用户是否已登录:

class UserLogoutSerializer(serializers.Serializer):
    def validate(self, data):
        # 验证当前请求用户是否已登录
        if not self.context['request'].user.is_authenticated:
            raise serializers.ValidationError("用户未登录,无法执行登出操作")
        return data

3. 实现登出视图(views.py)

通过删除用户的Token来完成登出,同时添加权限验证确保只有登录用户才能访问:

from rest_framework.permissions import IsAuthenticated  # 新增导入
from rest_framework.authtoken.models import Token

class LogoutView(views.APIView):
    # 仅允许已登录用户访问
    permission_classes = [IsAuthenticated]

    def post(self, request):
        serializer = UserLogoutSerializer(data=request.data, context={'request': request})
        if serializer.is_valid():
            # 删除当前用户的所有Token(确保彻底登出)
            Token.objects.filter(user=request.user).delete()
            return Response({'message': '登出成功'})
        return Response({'message': '操作失败', 'error': serializer.errors})

4. 必要的配置(settings.py)

在项目配置中启用Token认证:

INSTALLED_APPS = [
    # 其他已安装应用
    'rest_framework',
    'rest_framework.authtoken',  # 添加这一行
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',  # 设置默认认证方式为Token
    ],
}

5. 迁移数据库

执行迁移命令创建Token表:

python manage.py migrate

说明

  • 前端调用登出接口时,需要在请求头中携带Authorization: Token <用户登录时获取的token值>
  • 如果你的项目使用Session认证而非Token,登出逻辑可以改为request.session.flush(),此时不需要Token相关的配置和代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:18:19