Вход в систему работает в Django Rest Framework, но не на фронтенде

У меня следующие взгляды:

login_view:

@api_view(['POST'])
def login_view(request):

    try:
        user_data = request.data
        username = user_data["username"]
        password = user_data["password"]
        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            serializer = UserSerializer(user)
            return Response(
            {
                "user":serializer.data,
                "login": True
            })
        else:
            return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)
    except:
        raise Http404

logout_view:

@api_view(['POST'])
def logout_view(request):
    if request.user.is_authenticated:
        logout(request)
        return Response(status=status.HTTP_200_OK)
    else:
        return Response(status=status.HTTP_403_FORBIDDEN)

и функция fetch на frontend:

const onSubmit = () => {
    fetch('http://127.0.0.1:8000/api/login/',{
        method:"POST",
        headers: {
          'Accept': 'application/json, text/plain',
          'Content-Type': 'application/json; charset=UTF-8'
        },
        body: JSON.stringify({
          "username": values.Username,
          "password": values.Password
        })
        }).then((response) => {response.json().then(data => {                  
        if(response.ok){
            setError('');           
            console.log(data);
      } 
      else{
        setError('');
        setError('Invalid Username or Password');  
      }
    })});
  };

и следующая задача:

Когда я пытаюсь войти в систему на frontend, я получаю ожидаемый ответ:

{
  user: {id: 4, username: 'Tester_1', date_joined: '2021-12-02T22:38:29.323393Z', trust_index: 0}
  login: true
}

но мой пользователь не зарегистрирован в Rest Framework и я не могу использовать представление logout на Frontend: После входа на Frontend

Когда я использую панель Rest Framework для входа, все работает нормально, пользователь входит в систему и я могу использовать представление logout: После входа в Rest Framework

Я уже некоторое время бьюсь над этим вопросом. Есть идеи, как решить эту проблему?

Я не знаю вашего глобального кода, но похоже, что вы пытаетесь создать систему входа/авторизации на основе сессий, привнося подход автогенерируемой веб-панели drf в ваш front. В этой разделенной структуре (front и back) это не лучший подход, по крайней мере, вы создаете странную структуру, где Django инкапсулирует ваш front и управляет сессиями и т.д.

Возможно, лучшим способом является использование jwt token generation/authentication. Где вы аутентифицируетесь (спереди), используя пользователя и пароль, но получаете (сзади) токен, который вы должны хранить локально (локальное хранилище, для эмуляции сеанса).

В каждом запросе вы передаете токен в заголовке, и если все в порядке (токен правильный), drf делает все, что нужно.

Я использую простой JWT (https://django-rest-framework-simplejwt.readthedocs.io/en/latest/). Действительно просто.

А впереди Axios - хорошая js-библиотека для автоматизации передачи токенов при получении данных с помощью перехватчиков.

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