【问题标题】:getting json in flask from jquery ajax从 jquery ajax 获取烧瓶中的 json
【发布时间】:2014-02-12 20:15:38
【问题描述】:

我需要一些帮助来从 jquery ajax 获取烧瓶中的 json 数据。

在客户端 javascript 下方,每当单击某个按钮时都会调用它。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
    function change_status(item, status) {
          var statusObj={"desc":item, "status":status};
          $.ajax({
                    url:"/robot/api/"+item,
                    type: "PUT",
                    contentType:"applicaton/json",
                    dataType:"json",
                    data: JSON.stringify(statusObj)
          });
    }
</script>

在服务器端(flask),我有下面的代码来捕获 json 数据。

@app.route('/robot/api/<item>', methods = ['PUT'])
def update_item(item):

print "content_type: ", request.content_type

print "request.json: ", request.json

if not request.json:
    print "bad json format"
    abort(400)
else
    """
    do something like update data
    """

在PC中,当点击浏览器中调用javascript函数的按钮时,flask服务器正在打印以下消息:

"content_type:  applicaton/json; charset=UTF-8

request.json:  None

bad json format

192.168.1.241 - - [12/Feb/2014 15:06:16] "PUT /robot/api/3g HTTP/1.1" 400 -"

它显示 request.content_type 是 json 但实际打印时显示为 None。

我使用wireshark进行数据包捕获以查看来自PC的数据,我看到如下:

从 PC 到 Flask 服务器:

PUT /robot/api/3g HTTP/1.1

Host: "my flask server ip address"

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0

Accept: application/json, text/javascript, */*; q=0.01

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Content-Type: applicaton/json; charset=UTF-8

X-Requested-With: XMLHttpRequest

Referer: "my flask server ip address"

Content-Length: 28

Connection: keep-alive

{"desc":"3g","status":"off"}

但是 Flask 服务器返回“HTTP/1.0 400 BAD REQUEST”

【问题讨论】:

  • 您是否尝试过使用data: statusObj

标签: jquery ajax json flask


【解决方案1】:

这里的问题是您在“application/json”中缺少“i”。将您的 jQuery 调用更改为 contentType:"application/json"(而不是 contentType:"applicaton/json"),一切都会正常工作。

Flask 仅将请求正文中的负载加载为 JSON if the content type is application/json - 其他任何内容,您必须自己加载 JSON,使用 request.get_json(force=True)

【讨论】:

  • 谢谢肖恩,你是对的。我会这么傻的。为一个简单的错误浪费了我晚上 2 天的时间......
  • 这行得通!但是Content-Type被广泛传播(Flask不承认),标准是什么?
  • @SeanVieira 谢谢。但我的意思是,Content-TypecontentTypeContentType。 camelCase 或 Dash 分隔?是否区分大小写?
  • HTTP 标头 are not case sensitive 但它们必须用破折号分隔。其他语言和框架将改变键的处理方式,以便更方便地访问 从相关语言 - 在 jQuery 的情况下,作为 JavaScript,它们使用 camelCase 变体,因为它不需要用作键时引用。
猜你喜欢
  • 2017-04-16
  • 2017-08-24
  • 2018-05-17
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多