2014-12-16 5 views
-2

Я использую AngularJS для интерфейсного и Django для бэкэнд веб-приложения, над которым я работаю. Сейчас я работаю над входом в систему пользователей, и у меня возникла странная проблема. Heres соответствующий Угловой код:AngularJS/Django Post Response Data

app.factory('AuthService', ["$http", "$q", "Session", "URL", function($http, $q, Session, URL) { 
return { 

login: function(credentials) { 
    var deferred = $q.defer(); 
    $http.post(URL.login, credentials) 
      .then(function(data, status, headers, config) { 
       data=data.data; //WHY DOES THIS WORK? 
       if (data.success == true) { 
       alert("logged in"); 
       Session.create(credentials.username, data.api_key); 
       deferred.resolve(); 
       } 
       else { 
       deferred.reject("Login failed!"); 
       } 
      }, function(data, status, headers, config) { 
       deferred.reject("Login failed!"); 
      }); 
    return deferred.promise 
}, 

А вот соответствующий Джанго вид:

def login_user(request): 
    ''' 
    Given a username and password, returns the users API key. 
    ''' 
    if request.method == 'POST': 
     username = request.POST.get('username',None) 
     password = request.POST.get('password',None) 
     user = authenticate(username=username,password=password) 
     if user is not None: 
      api_key = ApiKey.objects.get(user=user) 
      response_data = {} 
      response_data["api_key"] = str(api_key).split(" ")[0] 
      response_data["success"] = True 
      return HttpResponse(json.dumps(response_data), content_type="application/json") 
     else: 
      return HttpResponse(json.dumps({"username":username,"success":False}),content_type="application/json") 
    return HttpResponseBadRequest() 

Когда пользователь входит в запросе POST отправляются и обрабатываются выше Джанго коды. Затем ответ подбирается кодом AngularJS выше. Как вы можете видеть, метод then() в угловом коде принимает обычные четыре параметра: данные, состояние, конфиг и заголовки. Я ожидаю, что данные содержат словарь, выводимый из кода Django, соответствующим образом сериализованный в объект JSON.

Однако происходит то, что единственным параметром метода then(), который не является неопределенным, являются данные, и это содержит ВСЕ; заголовки, данные, код состояния и т. д.

Линия, прокомментированная «ПОЧЕМУ ЭТА РАБОТА», устраняет проблему, обращаясь к данным внутри. Тем не менее, я хочу знать, почему это происходит, и если есть способ избежать этого. Я думаю, что это связано с тем, как Django сериализует ответ, но я не уверен.

Я использую Django 1.6.5.

+0

Я рекомендовал прочитать это https://thinkster.io/django-angularjs-tutorial – mrvol

ответ

0

Это на самом деле как Угловые обещания работают according to the docs. Вот соответствующая цитата.

Поскольку возвращаемое значение вызова функции $ HTTP это обещание, вы также можете использовать то метод для регистрации обратных вызовов, и эти обратные вызовы будут получать один аргумент - объект, представляющий ответ. Дополнительную информацию см. В описании и подписи API.

Акцент был мой.

+0

Ах, извините, я новичок в Angular. Спасибо за помощь :) – MichaelJK