AngularJS / Django后响应数据

时间:2014-12-16 20:16:28

标签: django angularjs django-1.6

我正在使用AngularJS作为前端,Django作为我正在使用的Web应用程序的后端。现在我正在努力登录用户,我遇到了一个奇怪的问题。下面是相关的Angular代码:

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
},

这是相应的Django视图:

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请求时,由上述Django代码发送和处理。然后,上面的AngularJS代码会选择响应。如您所见,Angular代码中的then()方法采用通常的四个参数:data,status,config和headers。我希望看到数据包含Django代码的字典输出,并适当地序列化为JSON对象。

然而,会发生的事情是then()方法中唯一未定义的参数是数据,这包含一切;标题,数据,状态代码等。

通过访问里面​​的数据,该行评论'为什么这个工作'解决了这个问题。但是,我想知道为什么会发生这种情况,如果有任何办法可以避免这种情况。我最好的猜测是它与Django序列化响应的方式有关,但我不确定。

我正在使用Django 1.6.5。

1 个答案:

答案 0 :(得分:0)

这实际上是Angular承诺的工作方式according to the docs。这是相关的引用。

  

由于调用$ http函数的返回值是一个promise,   你也可以使用then方法注册回调,以及这些   回调将收到一个单个参数 - 一个表示的对象   的响应即可。有关更多详细信息,请参阅API签名并在下面输入信息。

重点是我的。