Невозможно получить данные из django в react [duplicate]
Итак, я создаю страницу входа в систему. Я создал свои модели, а также представления и конечные точки. При входе в систему я пытался получить данные из бэкенда с помощью django, чтобы проверить введенные учетные данные, но получил ошибку времени выполнения
TypeError: Failed to fetch at HandleSubmit
Я успешно зарегистрировал пользователя, проверил в базе данных, чтобы убедиться, что пользователь существует
Основной обзор моей установки. У меня есть модель LoginDetails, которая была установлена как AUTH_USER_MODEL в settings.py.
Вот моя модель
class LoginDetails(AbstractUser):
user_data = models.OneToOneField(UserData, on_delete=models.CASCADE, null = True)
username = models.CharField(max_length=255, unique=True, null=True)
password = models.CharField(max_length=255, null=True) # Note: It's recommended to use hashed passwords in production
USERNAME_FIELD = 'username'
def __str__(self):
return self.username
Вот мой login.js (выкладываю только релевантную информацию) EDIT: Выкладываю полный файл
import React, { useState} from 'react';
import { Link, useNavigate } from 'react-router-dom';
import '../css/login.css';
import axios from 'axios';
function Login() {
const initalFormData={
username: '',
password: '',
};
const [formData, setFormData] = useState({...initalFormData});
const navigate = useNavigate();
const [redirect, setRedirect] = useState(false);
const handleChange = (e) => {
const { name, value } = e.target;
setFormData(prevState => ({
...prevState,
[name]: value
}));
};
const handleSubmit = async (event) => {
event.preventDefault();
const response = await fetch('http://127.0.0.1:8000/api/login/', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
credentials: 'include',
body: JSON.stringify({
formData
})
});
const content = await response.json();
setRedirect(true);
};
return (
<div className="login-container">
<h2>Login</h2>
<form onSubmit={handleSubmit}>
<div className="input-group">
<label htmlFor="username">Username</label>
<input
type="text"
id="username"
name="username"
value={formData.username}
onChange={handleChange}
required
/>
</div>
<div className="input-group">
<label htmlFor="password">Password</label>
<input
type="password"
id="password"
name="password"
value={formData.password}
onChange={handleChange}
required
/>
</div>
<button type="submit">Login</button>
</form>
<div className="register-link">
<span>Don't have an account? </span>
<Link to="/employeeregistration">Register</Link>
</div>
</div>
);
}
export default Login;
И представление, связанное с моей конечной точкой api/login.
EDIT: Я добавил оператор печати в нижеприведенное представление, чтобы проверить, принимает ли оно введенное имя пользователя
В терминале python, на котором запущен сервер django, при печати имени пользователя я получаю None.
class LoginView(APIView):
def post(self, request):
username = request.data.get('username')
password = request.data.get('password')
print(username)
user = LoginDetails.objects.filter(username=username).first()
if user is None:
return Response({'error': 'Invalid username'}, status=status.HTTP_401_UNAUTHORIZED)
if not user.check_password(password):
return Response({'error': 'Invalid password'}, status=status.HTTP_401_UNAUTHORIZED)
print(user.user_data.role)
payload = {
'id': user.id,
'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=60),
'iat': datetime.datetime.utcnow()
}
token = jwt.encode(payload, 'secret', algorithm='HS256').decode('utf-8')
response = Response()
response.set_cookie(key='jwt', value=token, httponly=True)
response.data = {
'jwt': token
}
return response
Вот сериализатор, который я использую
class LoginDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = LoginDetails
fields = '__all__'
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
password = validated_data.pop('password', None)
instance = self.Meta.model(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance