Не получение токена в ответе от реакции app.js принести

#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