drf中刷新token中添加额外的数据

标题如果需要添加额外的数据,则必须重写改接口

方法一

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

  1. 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值