Как правильно выйти из пользователя через представление на основе класса, используя 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')