#django #reactjs #django-rest-framework
#django #reactjs #django-rest-framework
Вопрос:
Я связываю django с react.
Я пытаюсь получить токен из конечной точки Django-rest-framework http://127.0.0.1:8000/api/get-token который использует проверку подлинности токена, начиная с react app.js . Я настроил corsheaders и restframework все это. когда я попадаю в конечную точку через командную строку с помощью токена, это работает. Теперь мне нужен токен в моей реакции app.js . Я получаю ответ со статусом 200, но не могу найти токен. Поскольку я новичок в react, я не уверен, что я что-то упускаю. //App.js
componentDidMount() {
try {
const data = {username: 'user', password: 'password'};
fetch('http://127.0.0.1:8000/api/get-token/', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
}).then(function(response) {
console.log(response.token);
})
} catch (e) {
console.log(e);
}
}
Дайте мне знать, если вам нужна дополнительная информация
Я пробовал как проверку подлинности токена, так и базовую проверку подлинности в моем settings.py
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
...
}
Комментарии:
1. Вы пробовали
response.data.token
? Или запишите весь ответ и проверьте, что вы получаете, чтобы убедиться, что токен присутствует2. Ответ {тип: «cors», url: » 127.0.0.1:8000/api/get-token «, перенаправление: false, статус: 200, ok: true, …} тело: ReadableStream bodyUsed: false заголовки: Заголовки proto : Заголовки ok: true перенаправление: false статус: 200 statusText: «OK» введите: «cors» url: » 127.0.0.1:8000 /api / get-token » прото : Ответ Это ответ, который я получаю. Я не думаю, что у него есть токен. когда я пытаюсь response.data.token App.js: 20 неперехваченных (в обещании) Ошибка типа: не удается прочитать свойство ‘token’ неопределенного значения в App.js:20 Я получаю это
Ответ №1:
При использовании выборки сначала необходимо прочитать поток ответов с помощью .response.json()
.
Это ваш пример кода с добавлением then
после выборки, чтобы вернуть новое обещание, содержащее ваши данные (проанализированные с помощью JSON):
componentDidMount() {
try {
const data = {username: 'user', password: 'password'};
fetch('http://127.0.0.1:8000/api/get-token/', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
}).then(function(response) {
return response.json();
}).then(function(data) {
console.log(data.token);
})
} catch (e) {
console.log(e);
}
}
Примечание: если данные, которые вы получаете с сервера, не являются JSON, вы должны использовать response.text()
для простого анализа ответа в виде строки.
Комментарии:
1. Итак, теперь, когда я получаю токен, могу ли я использовать тот же формат для доступа к конечной точке api, откуда я пытаюсь получить сериализованные данные? « выборка (‘ 127.0.0.1:8000/api/testbuildingtype ‘, { метод: ‘POST’, заголовки: { ‘Accept’: ‘application / json’, ‘Content-Type’: ‘application / json’, ‘Аутентификация’: ‘Токен ‘ токен } }).затем(функция (ответ) { возвращает response.json(); }).затем(функция (данные){консоль.журнал (данные); }) «
2. @DaminiGanesh да, это должно сработать. Вы всегда должны читать поток ответов, используя либо
.text()
или.json()
для доступа к данным с помощью выборки.3. Но теперь я получаю эту ошибку, доступ к выборке по адресу ‘ 127.0.0.1: 8000 /api / testbuildingtype ‘ из источника ‘ localhost: 3000 ‘ заблокирован политикой CORS: аутентификация поля заголовка запроса не разрешена с помощью Access-Control-Allow-Headers в предполетном ответе. localhost/:1 неперехваченный (в обещании) Ошибка типа: не удалось выполнить выборку, я попробовал оба .text() и .json()
4. @DaminiGanesh это совершенно другая проблема. Вы должны проверить django-rest-framework.org/topics/ajax-csrf-cors