修改Djangorestframework-simplejwt用户登录成功及失败的默认输出

2022-08-24 12:37:39

Djangorestframework-simplejwt是Django REST Framework框架的一个jwt插件,具体使用方法如下:https://github.com/davesque/django-rest-framework-simplejwt

一通配置好后,默认的鉴权输出如图:

但是前端接收的api接口格式为:

这就需要我们对框架的返回格式进行修改,最简单暴力的方法就是修改源码,定位到框架的这个目录:

找到如下函数:

这个data返回的就是最后登录成功的参数格式,只要修改为如下即可:

当然,需要其他的格式只要在这个函数里面组装就可以了,最后返回出来就行。

以上是修改登录成功的方法,那登录失败怎么办呢?登录失败要么是用户名不对,要么是密码不对,二者有一个不对数据库的返回都是None,所以我们还贴出之前serializers.py文件里TokenObtainPairSerializer类的代码:

class TokenObtainSerializer(serializers.Serializer):
    username_field = User.USERNAME_FIELD

    # 默认的登录错误的信息,讲这边修改为你想要的信息
    # 比如no_active_account': _('用户名或密码错误!')
    
    default_error_messages = {
        'no_active_account': _('No active account found with the given credentials')
    }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields[self.username_field] = serializers.CharField()
        self.fields['password'] = PasswordField()

    def validate(self, attrs):
        authenticate_kwargs = {
            self.username_field: attrs[self.username_field],
            'password': attrs['password'],
        }
        try:
            authenticate_kwargs['request'] = self.context['request']
        except KeyError:
            pass

        self.user = authenticate(**authenticate_kwargs)


        if self.user is None or not self.user.is_active:
            raise exceptions.AuthenticationFailed(
                self.error_messages['no_active_account'],
                'msg',
            )

        return {}

    @classmethod
    def get_token(cls, user):
        raise NotImplementedError('Must implement `get_token` method for `TokenObtainSerializer` subclasses')

将default_error_messages修改好后,再去

这个文件中进行修改:

下面解释一下上图中exc这个对象,我们在这边打个断点调试一下:

从图中可以看出exc里面包含了错误的各种信息,需要说明一下的就是,大部分api接口的格式都是形如{"code":-1,"msg":"error"}的形式的,code往往是自己拟定的一些有对应关系的数字,那如何返回自定义的code呢,就是通过exc的第一个参数args了,这个参数是一个元组,元组的对应我们之前serializer.py文件里面这个如下参数:

只要将'no_active_account'修改为我们想要与‘用户名密码错误’相应的code就行了。当然这个只是修改了AuthenticationFailed错误的code,其他的也是照着这么改就行了。最后在views.py文件里面将格式做如下的修改就可以了:

经过以上操作,就可以返回我们想要的格式了,如图:

重要提醒: 修改框架源码需谨慎

                   防止一失足成千古恨!

  • 作者:躲在车里的猫
  • 原文链接:https://blog.csdn.net/airconan/article/details/104580489
    更新时间:2022-08-24 12:37:39