Почему после добавления localstorage в backbone-модель POST-запрос ничего не возвращает?

Добрый день! Изучаю связку backbone+jquerymobile, на сервере использую django rest framework. Возникла следующая проблема:

1. [код без комментариев] Когда я отправляю на сервер связку логин/пароль в ответ от сервера получаю токен в формате { token: "mytoken"}. Я могу его просмотреть выполнив console.log(response.token)

2. Далее мне нужно этот токен сохранить в localstorage, чтобы потом передать в хедер (с пом. переопределенного backbone.sync)

3. [код с комментариями] Я добавил в модель localstorage и во вью присваиваю в переменную access_token. Теперь когда я отправляю мои логин/пароль, токен не возвращается а console.log(response.token) возвращает undefined. Проблема не в новом методе backbone.sync, потому, что если токен передавать явно во вью, то все работает как нужно.

Что я делаю не так? Кто может объяснить почему после добавления localstorage я не получаю токен. Или как еще можно передавать в хедер полученный токен?

Моя модель:
var User = Backbone.Model.extend({
    defaults: {
        username: "",
        password: ""
    },

    url: appConfig.baseURL + "api-token-auth/",
    //localStorage: new Store('srt')
});

Кусок вью:
user.save({}, { 
    success: function(model, response) {
      if (typeof response.token === "undefined") {
        console.log('Token is undefined');
      } else {
        console.log('Token is exists');
        //localStorage.setItem('access_token', response.token);
        window.workspace.navigate('#', { trigger: true});
        return true;
    }},

    error: function(model, response) {
      var error = JSON.parse(response.responseText)
      console.log('Error: ' + error.detail);
    }

Переопределенный Backbone.sync:
Backbone._sync = Backbone.sync
Backbone.sync = function(method, model, options) {
    options = $.extend({
        crossDomain: true
        , xhrFields: {
            withCredentials: true
        }
        , beforeSend: function(xhr){
            xhr.setRequestHeader('Authorization', 'Token ' + localStorage.getItem('access_token'));
        }
    }, options);

    return Backbone._sync(method, model, options);
}
  • Вопрос задан
  • 3613 просмотров
Пригласить эксперта
Ответы на вопрос 3
Grigorieff
@Grigorieff
if( model && (method === 'create' || method === 'update' || method === 'patch') ) {
        options.contentType = 'application/json';
       options.data = JSON.stringify(options.attrs || model.toJSON());
}


в переопределение Backbone.sync вставте в самый верх.
Ответ написан
@personaljs
user.save({}, { 
    success: function(response) {
      if (response.token) {
      localStorage.setItem('access_token', response.token);
      window.workspace.navigate('#', { trigger: true});
    }},
    error: function(response) {
      var error = JSON.parse(response.responseText)
    }

попробуйте так

Backbone._sync = Backbone.sync
Backbone._sync = function(method, model, options) {
    options = $.extend({
        crossDomain: true
        , xhrFields: {
            withCredentials: true
        }
        , beforeSend: function(xhr){
            xhr.setRequestHeader('Authorization', 'Token ' + localStorage.getItem('access_token'));
        }
    }, options);

    return Backbone._sync(method, model, options);
}

у вас ошибка была
Ответ написан
Комментировать
@aphex Автор вопроса
В общем проблема была в том, что конкретно для логина не нужно было переопределять backbone.sync. Я сделал для модели юзера отдельный sync, для все остального - переопределенный и все заработало.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы