Как получить объект пользователя в Django REST через фронтенд React
После того, как пользователь вошел в приборную панель, я хочу также получить объект пользователя, чтобы заполнить приборную панель соответствующими данными. Сейчас логин с использованием DJ_rest_auth работает отлично, но я не знаю, как дальше получать данные.
Мой подход:
- Пользователь входит в систему
- При успехе обработчик выборки вызывает другую выборку
getUser, которая использует только что установленный токен из локального хранилища, чтобы сделать еще один запрос API для получения экземпляра пользователя .
В Django у меня есть модель 1-1 UserProfile, связанная с моделью BaseUser. Также dj_rest_auth хранит токен 1-1 в модели BaseUser.
Сейчас утилита getUser вообще не вызывается в обратном вызове ответа на выборку. Также я не уверен, что это вообще осуществимый подход.
// React Login Component
const Login = () => {
// Set reducer with empty dicitonary as initial value
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const [errors, setErrors] = useState(false);
const [loading, setLoading] = useState(true);
useEffect(() => {
if (localStorage.getItem('token') !== null) {
window.location.replace('http://localhost:3000/dashboard');
} else {
setLoading(false);
}
}, []);
const submitHandler = event => {
event.preventDefault()
const user = {
username: username,
password: password
};
fetch('http://127.0.0.1:8000/api/user/auth/login/', {
method: 'POST',
body: JSON.stringify(user),
headers: {'Content-Type': 'application/json'},
})
.then(res => res.json())
.then(data => {
if (data.key) {
localStorage.clear();
localStorage.setItem('token', data.key);
// Get the user object instance via another API request
getUser(data.key)
// Redirect to Dashboard
window.location.replace('http://localhost:3000/dashboard/planner');
} else {
setUsername('');
setPassword('');
localStorage.clear();
setErrors(true);
}});
}
// React getUser util function
export const getUser = (token) => {
fetch('http://127.0.0.1:8000/api/user/object/', {
method: 'GET',
body: JSON.stringify(token),
headers: {
'Content-Type': 'application/json',
}
})
.then(res => res.json())
.then(data => {
console.log(data);
});
};
// Django view
class UserDetail(APIView):
"""
Retrieve, update or delete a Offer instance
"""
def get_object(self, token):
print(token)
print('test')
try:
return UserProfile.objects.get(user__tokens=token)
except UserProfile.DoesNotExist:
raise Http404
def get(self, request, token):
print('test2')
user = self.get_object(token)
serializer = UserProfileSerializer(user)
return Response(serializer.data)
// Django Model
class UserProfile(models.Model):
"""
Extends Base User 1-1
"""
# Relations
user = models.OneToOneField(User, on_delete=models.CASCADE)
..