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文件里面将格式做如下的修改就可以了:
经过以上操作,就可以返回我们想要的格式了,如图: