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

Django REST JWT如何自定义账号密码错误时的返回报错信息

解决方案

问题根因

默认TokenObtainSerializer的凭证校验错误触发的是内置no_active_account键对应的提示,你自定义的login_error键框架无法识别,因此自定义报错没有生效。

方法1:直接覆盖内置错误键(最简实现)

直接将自定义提示绑定到框架内置的错误键即可,无需修改其他业务逻辑:

class TokenPairSerializer(TokenObtainSerializer):
    default_error_messages = {
        # 覆盖内置错误键,直接触发自定义提示
        'no_active_account': _('用户名或密码错误')
    }

    @classmethod
    def get_token(cls, user):
        return RefreshToken.for_user(user)

    @classmethod
    def get_user_type(cls, user):
        if user.is_superuser:
            return 'super_user'
        elif user.is_student:
            return 'student_user'
        elif user.is_teacher:
            return 'teacher_user'

    def validate(self, attrs):
        data = super().validate(attrs)
        refresh = self.get_token(self.user)
        # 补充返回字段
        data['refresh'] = str(refresh)
        data['access'] = str(refresh.access_token)
        data['user_type'] = self.get_user_type(self.user)
        return data

方法2:自定义错误返回键(需返回login_error作为键时使用)

如果要求报错返回的键必须是login_error,可以重写validate方法捕获父类校验异常,抛出自定义格式的错误:

from rest_framework import serializers

class TokenPairSerializer(TokenObtainSerializer):
    default_error_messages = {
        'login_error': _('用户名或密码错误')
    }

    @classmethod
    def get_token(cls, user):
        return RefreshToken.for_user(user)

    @classmethod
    def get_user_type(cls, user):
        if user.is_superuser:
            return 'super_user'
        elif user.is_student:
            return 'student_user'
        elif user.is_teacher:
            return 'teacher_user'

    def validate(self, attrs):
        try:
            data = super().validate(attrs)
        except serializers.ValidationError:
            # 捕获原有异常,抛出自定义格式报错
            raise serializers.ValidationError({
                'login_error': self.error_messages['login_error']
            })
        refresh = self.get_token(self.user)
        data['refresh'] = str(refresh)
        data['access'] = str(refresh.access_token)
        data['user_type'] = self.get_user_type(self.user)
        return data

配套视图配置

完成序列化器开发后,需要将其绑定到JWT登录视图:

from rest_framework_simplejwt.views import TokenObtainPairView

class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = TokenPairSerializer

最后将登录路由指向该自定义视图即可生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 06:27:04