Django Запрос выхода из системы возвращает запрещенный запрос 403, связанный с CSRF
from rest_framework import views, status
from rest_framework.response import Response
from django.contrib.auth import authenticate, login,logout
from rest_framework.permissions import AllowAny, IsAuthenticated
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
class LoginView(views.APIView):
permission_classes=[AllowAny]
def post(self, request):
username = request.data.get('username')
password = request.data.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return Response({'message': 'Logged in successfully'}, status=status.HTTP_200_OK)
return Response({'message': 'Invalid credentials'}, status=status.HTTP_400_BAD_REQUEST)
class LogoutView(views.APIView):
def post(self, request):
logout(request)
return Response({'message': 'Logged out successfully'}, status=status.HTTP_200_OK)
@csrf_exempt
def logoutView(request):
print(request.COOKIES)
logout(request)
return JsonResponse({'message': 'Logged out successfully'}, status=status.HTTP_200_OK)
class UserInfoView(views.APIView):
permission_classes=[IsAuthenticated]
def get(self, request):
user = request.user
return Response({'username': user.username}, status=status.HTTP_200_OK)
При отправке
запроса на login или userinfoview все работает нормально с csrf-токенами. однако класс LogoutView возвращает запрещенный 403. ФУНКЦИЯ logoutView работает нормально ТОЛЬКО при применении csrf_exmpt. при печати request.cookies возвращается: {'csrftoken': 'DdQZJC56QBSAcDqXVlrXz4mMeVWitpNV', 'sessionid': 'poul3qidl8xw4k5bp2rwazbxo76eq9sq'} Я пытался исключить класс из csrf, потому что именно его я хочу использовать вместо функции, чтобы код выглядел чище, но не смог понять, как исключить класс. Более того, я не хочу исключать csrf для начала, если это не единственное решение.EDIT: после добавления метода_decorator(csrf_protect) к логину я понял, что csrf не работает и для логина. потому что я начал получать сообщение об отсутствии токена cSRF. так что ошибка связана с неправильным использованием токена CSRF.
я обновил код, превратив класс logout в метод get, и это сработало. хотя это и решение. оно все еще не отвечает на вопрос, как установить токен csrf для повторной регистрации.
Примечание: использование react в качестве фронтенда.