如何在 rest_framework 中注销?这是我的用户序列器。我正在使用 rest,而且是非常非常的新手。注册和登录可以用,但不知道如何实现注销。
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代码时,得到错误:类型对象'Token'没有属性'对象'。
permission_classes = settings.PERMISSIONS.token_destroy
def post(self, request):
utils.logout_user(request)
return Response(status=status.HTTP_204_NO_CONTENT)
得到这个错误:类型对象'Token'没有属性'objects'。
我想你使用的是 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)
.
例如,在JWT认证的情况下,由于它是无状态的,而且每个JWT令牌都有一段时间的有效期,这意味着即使你从数据库中删除了令牌,用户仍然能够使用你的终端。
def get(self, request):
logout(request)
return Response(status=status.HTTP_200_OK)
在JWT认证的情况下,由于它是无状态的,而且每个JWT令牌都有一段时间的有效期,这意味着即使你从DB中删除了令牌,用户仍然可以在短时间内使用你的端点,直到它过期。因此,根据你想深入的程度,你可以例如实现一个 "tokens_unable_to_login "的缓存键,并检查请求是否包含一个不应该登录的JWT令牌。或者你让它过期--你可以玩弄一下token的过期时间,看看什么是你的用例的理想选择。这取决于你的业务需求。
让我知道你是怎么做的。