使用Flask和Angular加载JSON的错误

时间:2014-10-18 22:19:28

标签: python json angularjs flask

我已经解决了我的问题,但我想知道出了什么问题所以我将来可以解决它。我在解码传入的JSON时遇到问题,无法在我的Flask应用程序中使用。

以Angular发送它的代码:

$http.post("/login", JSON.stringify($scope.loginForm))
  .success(function(data, status, headers, config) {
    console.log(data);
  })
  .error(function(data, status, headers, config) {
    console.log("Submitting form failed!");
  });

重要的是要注意,请求类型早先设置为application / json,

$http.defaults.headers.post["Content-Type"] = "application/json";

在Flask中接收它的代码:

data = request.get_json()
email_address = data.get("email_address")
password = data.get("password")

尝试以这种方式加载它会返回错误400,但任何其他方式都会导致一些非常奇怪的问题。例如:

return json.dumps(request.get_json())

将在控制台中记录{“password”:“password”,“email_address”:“email@email.com”},但尝试执行此操作:

data = request.get_json()
email_address = data.get("email_address")
password = data.get("password")

除了我没有强制它之外,这与第一个代码块之间没有任何区别,我收到异常“ValueError:需要多于1个值来解包”。这意味着没有两个值可以解包。

但是,他们都是单独工作的。如果我执行上述请求并省略上面的data.get()行,则另一个将起作用。

我的设置如何导致我的JSON对象在第一次访问时崩溃?

我通过使用request.json而不是request.get_json()来解决这个问题,但是因为request.json已被弃用,所以我知道如何在将来解决这个问题。任何指针都将不胜感激!

1 个答案:

答案 0 :(得分:0)

您可以省略JSON.stringify并将对象直接传递给$http.post()方法,因为angular会自动将其序列化为JSON,formData是对象。因此,我认为JSON.stringify会强制发送角度为x-www-form-urlencoded而不是application/json媒体类型。

请参阅默认转换部分:angular $http service documentation