Вход в систему работает в 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-библиотека для автоматизации передачи токенов при получении данных с помощью перехватчиков.