我正在使用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。
答案 0 :(得分:0)
这实际上是Angular承诺的工作方式according to the docs。这是相关的引用。
由于调用$ http函数的返回值是一个promise, 你也可以使用then方法注册回调,以及这些 回调将收到一个单个参数 - 一个表示的对象 的响应即可。有关更多详细信息,请参阅API签名并在下面输入信息。
重点是我的。