Отправка текущего зарегистрированного пользователя из бэкенда Django во фронтенд React с помощью axios
Я пытаюсь отправить текущее имя пользователя, вошедшего в систему, из бэкенда django во фронтенд React. Я создал конечную точку currentuser/, которая прекрасно работает в бэкенде, она возвращает ожидаемый результат, но когда я вызываю эту конечную точку api в React с помощью axios, там возвращается нулевое значение.
Вот код для бэкенда
#view.py
from django.contrib.auth import get_user_model
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.views import APIView
User = get_user_model()
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username')
class LoggedInUserView(APIView):
def get(self, request):
serializer = UserSerializer(request.user)
return Response(serializer.data)
#urls.py
urlpatterns = [
path('currentuser/', views.LoggedInUserView.as_view(), name='currentuser'),
]
Вот результат при вызове api напрямую
Вот код для фронтенда
class App extends React.Component {
state = {
users: [],
}
getUsers() {
axios.defaults.headers.common['Content-Type'] = 'application/json';
axios.get(`http://localhost:8000/currentuser/`)
.then(res => {
console.log("res :", res);
const user = res.data;
console.log("response from backend", user);
this.setState({ users: user });
console.log(this.state.users);
})
.catch(err => {
console.log("error:", err);
});
console.log(this.state.users);
}
constructor(props) {
super(props);
this.getUsers();
}
render() {
return (.....)
}
};
export default App;
Вот результат при вызове api из фронтенда
Любые предложения будут оценены по достоинству
Только сейчас изучаю эту тему. Вы вошли в систему на React front-end? Если вы просто хотите получить профиль авторизованного пользователя. Вот мое решение для справки.
Сначала я попробовал использовать простую JWT аутентификацию для настройки react и Django. (погуглите "JWT аутентификация Django и React", есть много обучающих материалов).
.Затем авторизуйтесь на сайте react, и из ответа Django вы сможете получить данные о залогиненном пользователе. response.data является токеном, что означает, что вы можете использовать "jwt_decode" для получения нужной вам информации, включая: имя пользователя, id, email. (может возникнуть проблема безопасности... см. Если вы можете декодировать JWT, насколько они безопасны? , просто для обучения должно подойти). Ваш код может выглядеть следующим образом:
axios.post("http://127.0.0.1:8000/token/", {
username: username,
password: password,
})
.then((response) => {
let token = response.data.access;
localStorage.setItem("token", token);
let user_id = jwt_decode(response.data.access).user_id;
...
localStorage.setItem("user_id", user_id);
})
- После того, как вы получили свой user_id в localstorage, вы можете использовать его для получения всех деталей, ваш код может выглядеть следующим образом:
let id = parseInt(localStorage.getItem("user_id"));
const userDetail = (id) => {
const token = localStorage.getItem("token");
axios
.get(`http://127.0.0.1:8000/users/${id}`, {
headers: { Authorization: token },
})
.then(function (response) {
console.log(response.data);
})
.catch(function (error) {
console.log(error);
});
В response.data включена вся информация, которую вы разместили на вашем Django back-end API. Надеюсь, это помогло.