如何注销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)
得到此错误:类型对象'令牌'没有属性'对象']
我假设您使用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令牌。或者让它过期-您可以考虑令牌的过期时间,并查看最适合您的用例的方法。这取决于您的业务需求。
让我知道这对您有何帮助。