标题如果需要添加额外的数据,则必须重写改接口
方法一
1.在视图中继承TokenRefreshView,并且序列化器使用自定义的
class getToken(TokenRefreshView):
serializer_class = GetTokenSerializer
def post(self, request, *args, **kwargs):
return super().post(request, *args, **kwargs)
# serializer_class = TokenRefreshSerializer
# def post(self, request, *args, **kwargs):
#
# serializer = self.get_serializer(data=request.data)
# try:
# serializer.is_valid(raise_exception=True)
# serializer.validated_data["times"]=time.time()
# return Response(serializer.validated_data)
# except TokenError as e:
# raise InvalidToken(e.args[0])
2.序列化中继承TokenRefreshSerializer
class GetTokenSerializer(TokenRefreshSerializer):
def validate(self, attrs):
refresh = self.token_class(attrs["refresh"])
data = {"access": str(refresh.access_token)}
print("第一次的data",data)
if api_settings.ROTATE_REFRESH_TOKENS:
if api_settings.BLACKLIST_AFTER_ROTATION:
try:
# Attempt to blacklist the given refresh token
refresh.blacklist()
print("执行了refresh.blacklist()")
except AttributeError:
# If blacklist app not installed, `blacklist` method will
# not be present
print("执行了pass")
pass
refresh.set_jti()
refresh.set_exp()
refresh.set_iat()
data["refresh"] = str(refresh)
# 在这里添加你需要的参数
data["time"] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
#
# print("处理过后的data",data)
return data
- TokenRefreshSerializer中需要重写的是validate方法 ,重写可以复制TokenRefreshSerializer中的
class TokenRefreshSerializer(serializers.Serializer):
refresh = serializers.CharField()
access = serializers.CharField(read_only=True)
token_class = RefreshToken
def validate(self, attrs):
refresh = self.token_class(attrs["refresh"])
data = {"access": str(refresh.access_token)}
if api_settings.ROTATE_REFRESH_TOKENS:
if api_settings.BLACKLIST_AFTER_ROTATION:
try:
# Attempt to blacklist the given refresh token
refresh.blacklist()
except AttributeError:
# If blacklist app not installed, `blacklist` method will
# not be present
pass
refresh.set_jti()
refresh.set_exp()
refresh.set_iat()
data["refresh"] = str(refresh)
return data
方法二
1.继承TokenRefreshView方法,并重写post方法
class getToken(TokenRefreshView):
serializer_class = GetTokenSerializer
serializer_class = TokenRefreshSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
try:
serializer.is_valid(raise_exception=True)
serializer.validated_data["times"]=time.time()
return Response(serializer.validated_data)
except TokenError as e:
raise InvalidToken(e.args[0])
2.查看post方法,看到drf中post方法逻辑,同时可以知道在哪里添加参数
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
try:
serializer.is_valid(raise_exception=True)
# 添加非序列化器中的参数(没有验证的字段,参数)
except TokenError as e:
raise InvalidToken(e.args[0])
return Response(serializer.validated_data, status=status.HTTP_200_OK)