【问题标题】:AngularJS/Django Post Response DataAngularJS/Django 发布响应数据
【发布时间】:2014-12-16 20:16:27
【问题描述】:

我将 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() 方法采用通常的四个参数:数据、状态、配置和标头。我希望看到数据包含来自 Django 代码的字典输出,并被适当地序列化为 JSON 对象。

然而发生的情况是 then() 方法中唯一未定义的参数是数据,它包含所有内容;标头、数据、状态码等

注释“为什么这样做”的行通过访问内部数据解决了问题。但是,我想知道为什么会发生这种情况以及是否有任何方法可以避免这种情况。我最好的猜测是它与 Django 序列化响应的方式有关,但我不确定。

我使用的是 Django 1.6.5。

【问题讨论】:

标签: django angularjs django-1.6


【解决方案1】:

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

由于调用$http函数的返回值是一个promise, 你也可以使用 then 方法来注册回调,这些 回调将接收一个单一参数——一个代表的对象 回复。有关详细信息,请参阅下面的 API 签名和类型信息。

重点是我的。

【讨论】:

  • 啊抱歉,我是 Angular 的新手。感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 2016-09-03
  • 2013-12-03
  • 2017-11-13
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
相关资源
最近更新 更多