Фреймворк Django REST выдает мне отсутствие токена csrf, когда я регистрируюсь для запросов POST

я создаю API с использованием django rest framework и django 5.2 когда я отправляю запрос POST, если я вошел в систему, это выдает ошибку отсутствия токена CSRF. но если я выхожу из системы, это дает мне ответ без ошибок. вот мои взгляды на обработку создания пользователя и аутентификации:

@api_view(['POST'])
def signup_view(request):
    if not request.user.is_authenticated:
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()

            return Response(serializer.data)
    
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    return Response({"detail": "The user is already logged in."}, status=status.HTTP_403_FORBIDDEN)

@api_view(['POST'])
def login_view(request):
    if not request.user.is_authenticated:
        
        user = authenticate(**request.data)
        print(request.POST)
        if not user:
            return Response({"detail": "User authentication failed."}, status=status.HTTP_400_BAD_REQUEST)
        
        login(request, user)
        return Response({"detail": "Login was succesful."})
    
    return Response({"detail": "The user is already logged in."}, status=status.HTTP_403_FORBIDDEN)

и вот мои взгляды на обработку методов get и post для модели:

class NoteListView(APIView):
    def get(self, request):
        notes = Note.objects.filter(author=request.user)
        serializer = NoteSerializer(notes, many=True)
        data = []

        for note in serializer.data:
            data.append({'title': note['title']})

        return Response(data)
        
    def post(self, request):
        serializer = NoteSerializer(data=request.data)
        serializer.initial_data['author'] = request.user
        print("1")
        
        if serializer.is_valid():
            print("2")
            serializer.save()
            print("3")
            return Response(serializer.data)
        
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

теперь я хочу знать, что я должен сделать, чтобы исправить ошибку отсутствия csrf в этой ситуации.

Я разработал такой же проект, как и вы, и добавил следующие строки в settings.py, чтобы устранить эту проблему.

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'my_app.custom_authentication.CustomJWTAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

Затем я определил класс под названием CustomJWTAuthentication. В этом классе вам нужно определить метод под названием authenticate, возвращаемыми значениями которого будут user и token.

class CustomJWTAuthentication(JWTAuthentication):
    def authenticate(self, request):
        auth = get_authorization_header(request).split()

        if not auth or auth[0].lower() != b'bearer':
            return None
        .
        .
        .
        .
        return (user, token)

Затем вам нужно добавить следующие строки в свои представления:

class MyView(APIView):
    authentication_classes = [CustomJWTAuthentication]
    permission_classes = [IsAuthenticated]

Как только вы это сделаете, элементы управления аутентификацией будут переданы вам, и ошибка отсутствия токена CSRF исчезнет.

Я также рекомендую изменить список вашего промежуточного программного обеспечения, как показано ниже:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', # <------------ add this
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Вернуться на верх