Django возвращает AnonymousUser, несмотря на предыдущую аутентификацию

У меня возникла проблема, когда я вызываю функцию login() внутри Django и, несмотря на то, что идентификатор пользователя установлен в сессии запроса, всякий раз, когда в другом представлении я вызываю request.user.is_authenticated, которая возвращает True.

Мой вид логина:

class LoginView(APIView):
    serializer_class = LoginUserSerializer

    def post(self, request):         
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            username = serializer.data.get('username')
            password = serializer.data.get('password')


            # If username is not present in the database at all
            user_exist_query = User.objects.filter(username=username)

            if not user_exist_query.exists():
                return JsonResponse({"error": "Username does not exist"}, status = 401)

            # If username and password match
            user_auth_query = authenticate(username=username, password=password)

            if user_auth_query is not None:
                login(request, user_auth_query)
                return JsonResponse({"message": "Login Successful"}, status = 200)
            else:
                return JsonResponse({"error": "Username and Password combination is incorrect"}, status = 401)
        return JsonResponse({"error": "Bad Request"}, status=400)

Другой вид, в котором аутентификация действительно работает:

class CheckAuthView(APIView):
    def get(self, request):
        if request.user.is_authenticated:
            return Response(status=status.HTTP_200_OK)
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)

Я использую это представление для защиты маршрута (использую React в качестве фронтенда). Домашняя страница доступна только для вошедших в систему пользователей, и всякий раз, когда я вхожу в систему, я могу просматривать эту страницу, а когда я выхожу, показывается другая страница, что доказывает, что здесь получение request.user действительно возвращает реального пользователя.

Вид, где есть проблемы:

class CreateClubView(APIView):
    serilizer_class = ClubSerializer
    
    def post(self, request):
        serializer = self.serilizer_class(data=request.data)

        print(request.user.is_authenticated)
        
        if serializer.is_valid():

            clubName = serializer.data.get('name')
            clubDesc = serializer.data.get('description')
            clubLoc = serializer.data.get('location')
            clubEmail = serializer.data.get('email')
            clubContact = serializer.data.get('contact')
            clubWebsite = serializer.data.get('website')
            clubOrganizer = request.session['id']
                        
            queryset = Club.objects.filter(name=clubName)
            if queryset.exists():
                return Response(status=status.HTTP_400_BAD_REQUEST)
                        
            
            club = Club.objects.create(name=clubName, description=clubDesc, location=clubLoc, 
                                            email=clubEmail, contact=clubContact, website=clubWebsite, organizer=clubOrganizer)
            club.save()

            
            
            return Response(status=status.HTTP_201_CREATED)
        
        return Response(status=status.HTTP_400_BAD_REQUEST)

Печать request.user возвращает AnonymousUser, а попытка доступа к request.session['id'] приводит к ошибке KeyError. Однако этого не должно быть, потому что если я вошел в систему раньше (что подтверждается ответом на вызов API для входа и тем фактом, что я могу получить доступ к главной странице).

Кроме того, код React, в котором я делаю вызов API:

        const response: Response = await fetch('http://127.0.0.1:8000/api/clubs/create', {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(form),
        })
        
        if (response.ok) {
            console.log("Club created successfully");
            navigate("/home");
        } else {
            console.log("Club creation failed");
        }

Что не так с моим кодом? Я неправильно понимаю, как работают сессии Django? У меня есть другой Django-проект, где я делаю то же самое, и там все прекрасно работает.

Я также попробовал вручную установить id перед вызовом login(), выполнив request.session['id'] = User.objects.get(username=username).id - это тоже не помогло.

Я видел несколько решений, связанных с Django settings.py, я не думаю, что я что-то упустил?

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    'corsheaders.middleware.CorsMiddleware',
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

Исправлено, на самом деле это было связано с CORS и тем, как я вызывал свои конечные точки API. Идентификатор сессии не устанавливался после входа в систему, потому что я делал такие запросы:

http://localhost:8000/api/authentication/login

После изменения на просто: /api/authentication/login, проблема была устранена, и куки идентификатора сессии устанавливаются правильно.

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