关于rest_framework_simplejwt和rest_framework_jwt的区别

在使用jwt令牌的时候 我用了rest_framework_simplejwt

img


但是好像用rest_framework_simplejwt就无法使用以下这种方式生成令牌

img

会产生报错如下

img

这个报错在使用rest_framework_jwt时不会出现
但是我用的是自定义的用户表 所以直接用rest_framework_jwt很麻烦 要搞各种自定义

使用rest_framework_simplejwt 我用postman来发送请求的时候是能够生成token的 那么该怎么用rest_framework_simplejwt在函数中生成token呢??

参考下面个例:

在rest_framework_simplejwt中,生成token需要使用jwt.encode方法,传入负责创建payload的字典和密钥即可。示例如下:

from rest_framework_simplejwt.tokens import RefreshToken

# 生成token
def generate_token(user):
    refresh = RefreshToken.for_user(user)
    token = str(refresh.access_token)
    return token

其中RefreshToken.for_user(user)方法可以自动创建并返回一个RefreshToken对象,str(refresh.access_token)则将access_token转为字符串。

同时,如果你需要自定义payload,可以通过继承rest_framework_simplejwt.tokens.AccessToken或rest_framework_simplejwt.tokens.RefreshToken来自定义,例如:

from rest_framework_simplejwt.tokens import RefreshToken

class MyToken(RefreshToken):
    def __init__(self, user):
        self.user_id = user.id
        super().__init__(user)

    @property
    def payload(self):
        payload = super().payload
        payload['user_id'] = self.user_id
        return payload

这里继承了RefreshToken类,并在__init__方法中添加了一个user_id属性,然后重写了payload属性,在其中加入了自定义的user_id字段。

然后在视图函数中就可以使用MyToken来生成token了:

def my_view(request):
    user = authenticate(request)
    token = str(MyToken(user).access_token)
    return Response({'token': token})