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
相关产品推荐
相关产品推荐

