Как правильно выйти из пользователя через представление на основе класса, используя Django Token Authentication?

У меня прекрасно работает представление входа в систему, и я думаю, что представление выхода из системы тоже должно работать правильно, но каждый раз, когда я нажимаю на кнопку для выхода пользователя, она выдает ошибку AonymousUser object has not attribute 'auth_token'.

Моя views.py ниже:

class LoginAPIHTML(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'accounts/login.html'

    def get(self, request):        
        serializer = LoginSerializer()
        return Response({'serializer': serializer})

    def post(self, request):
        serializer = LoginSerializer(data=request.data)
        if not serializer.is_valid():
            return Response({'serializer': serializer})
        
        user = authenticate(request, username=request.data['email'], password=request.data['password'])
        
        if user:
            login(request, user)
            return redirect('user')

        else:
            return redirect('login')

class LogoutAPIHTML(APIView):
    def get(self, request):
        request.user.auth_token.delete()
        logout(request)
        return redirect('login')

а шаблон, в котором я нажимаю кнопку выхода из системы, выглядит следующим образом:

<body>
    <h1>Use Details</h1>
 
    {% if request.user.is_authenticated %}
    <a href="{% url 'logout' %}">
        <input type="button" value="Logout"/>
    </a>
    {% else %}
    <h2>{{ message }}</h2>
    {% endif %}
</body>

Я думаю (вы не предоставили реализацию LoginSerializer), что в вашем представлении входа вы на самом деле не создаете токен аутентификации. Попробуйте сделать следующее:

from rest_framework.authtoken.models import Token


class LoginAPIHTML(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'accounts/login.html'

    def get(self, request):        
        serializer = LoginSerializer()
        return Response({'serializer': serializer})

    def post(self, request):
        serializer = LoginSerializer(data=request.data)
        if not serializer.is_valid():
            return Response({'serializer': serializer})
        
        user = authenticate(request, username=request.data['email'], password=request.data['password'])
        
        if user:
            Token.objects.create(user=user)  # Here
            login(request, user)
            return redirect('user')

        else:
            return redirect('login')
Вернуться на верх