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 в качестве фронтенда.

Вернуться на верх