如何在rest_framework中注销?

问题描述 投票:0回答:1

如何注销rest_framework?这是我的用户序列化器。我正在休息,非常非常新手。注册并登录正常,但不知道如何阻止注销。

class UserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(write_only=True)

    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'email')
        write_only_fields = ('username', 'email', 'password',)
        read_only_fields = ('id', )

注册部分

class UserCreateAPIView(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [permissions.AllowAny]

登录代码;我正在使用JWT身份验证。

path(r'login/', obtain_jwt_token, name='ObtainJWTToken'),

当我使用此代码时:

@api_view(['POST'])
def logout(request):
    request.auth.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

我收到错误:“字节”对象没有属性“删除”当我使用Djoser代码时:

permission_classes = settings.PERMISSIONS.token_destroy

    def post(self, request):
        utils.logout_user(request)
        return Response(status=status.HTTP_204_NO_CONTENT)

得到此错误:类型对象'令牌'没有属性'对象']

python django-rest-framework logout
1个回答
0
投票

我假设您使用TokenAuthentication

在这种情况下,请尝试一下此方法:

class LogoutAPIView(APIView):
    def get(self, request):
        request.user.auth_token.delete()
        return Response(status=status.HTTP_200_OK)

但是,请注意,这会删除令牌并因此强制注销。

如果使用SessionAuthentication,则get()类内的LogoutAPIView方法的主体可能只是logout(request)

例如

def get(self, request):
    logout(request)
    return Response(status=status.HTTP_200_OK)

对于JWT身份验证,由于它是无状态的,并且每个JWT令牌在一段时间内都有效,这意味着即使您从数据库中删除了该令牌,用户仍然可以在短时间内使用您的端点时间,直到过期。因此,根据您想走的深度,您可以例如。实现“ tokens_unable_to_login”缓存键,并检查请求是否包含不应登录的JWT令牌。或者让它过期-您可以考虑令牌的过期时间,并查看最适合您的用例的方法。这取决于您的业务需求。

让我知道这对您有何帮助。

© www.soinside.com 2019 - 2024. All rights reserved.