【问题标题】:AttributeError at /api/logout 'AnonymousUser' object has no attribute 'auth_token'/api/logout 'AnonymousUser' 对象的 AttributeError 没有属性 'auth_token'
【发布时间】:2021-02-12 13:18:23
【问题描述】:

我已成功部署登录视图并返回令牌,但是当我尝试注销时,它返回以下错误。我是新手,所以无法弄清楚原因。

这些是我的登录和注销视图。

class LoginUserView(GenericAPIView):
    permission_classes = [AllowAny]
    serializer_class = UserLoginSerializer

def post(self, request, *args, **kwargs):
    data = request.data
    serializer = UserLoginSerializer(data=data)
    serializer.is_valid(raise_exception=True)
    new_data = serializer.data
    user = serializer.validated_data["user"]
    token, created = Token.objects.get_or_create(user=user)
    #return response.Response(new_data, status=status.HTTP_200_OK)
    return response.Response({"token": token.key},   status=status.HTTP_200_OK)
    # return response.Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class Logout(GenericAPIView):
    def get(self, request, format=None):
        # simply delete the token to force a login
        request.user.auth_token.delete()
        return Response(status=status.HTTP_200_OK)

【问题讨论】:

    标签: django api authentication token


    【解决方案1】:

    当用户未正确验证时,您的问题就来了。使用request.is_authenticated 检查用户是否已通过身份验证。如果您已登录并且出现此错误,则意味着您的登录系统不正确,因为 Django 告诉 request.userAnonymousUser,这是没有人登录时 Django 使用的“用户”。

    class Logout(GenericAPIView):
        def get(self, request, format=None):
            # simply delete the token to force a login
            if request.is_authenticated():
                request.user.auth_token.delete()
            return Response(status=status.HTTP_200_OK)
    

    【讨论】:

    • 这会删除令牌吗??它返回 200 响应,但我怎么知道用户已注销?
    • 如果您的意思是令牌作为会话信息和 cookie,是的。检查docs。不过,您必须使用auth.login 登录。
    • 我如上所示登录我们。我相信,我正在尝试在登录 api 视图而不是会话中使用令牌身份验证。我是新来的。但我不确定注销时使用的是哪个。它会删除令牌并注销用户还是结束会话并注销用户?另外,如果是它的会话,会话持续多长时间以及如何确定呢??
    • 你能澄清一下什么是令牌吗?我也是 Django 的新手。
    • 我现在已经编辑了我的答案。请检查这是否有效。
    【解决方案2】:

    你需要设置permission_classes

    from rest_framework.generics import GenericAPIView
    from rest_framework.permissions import IsAuthenticated
    
    
    class Logout(GenericAPIView):
        permission_classes = [IsAuthenticated]
        authentication_classes = [YourAuthClass] 
    
        def get(self, request, format=None):
            # simply delete the token to force a login
            request.user.auth_token.delete()
            return Response(status=status.HTTP_200_OK)

    注意:如果您没有设置默认类,您可能还需要设置authentication_classes

    【讨论】:

    • 我在 Logout 类中使用了 permission_classes = [IsAuthenticated] authentication_classes = [TokenAuthentication]。现在,当我尝试在邮递员中使用授权和令牌测试注销 api 时,它会生成 404 错误。你能帮忙吗??
    • 仔细检查您请求的网址,可能是错误的
    • 只是确认:我应该把授权放在密钥和令牌“我的令牌”在邮递员的标题下,对吗?网址没问题
    • 如果您的身份验证不正确,DRF 将向您发送401403,而不是404
    猜你喜欢
    • 2020-10-13
    • 2020-05-10
    • 2021-06-18
    • 2017-05-27
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多