【问题标题】:Accessing request.json in Flask results in an exception在 Flask 中访问 request.json 会导致异常
【发布时间】:2014-04-13 03:27:36
【问题描述】:

我使用的是 Flask 0.10.1,并且我有一个 Flask 函数,它的开头是这样的:

@app.route('/logs', methods=['POST'])
def add_log():
    db = get_db()

    print("\ninside /logs POST\n===================")
    print(request.headers)

    print('--------------')
    print(request.form)

    print('--------------')
    try:
        print(request.json)
    except Exception as e:
        print('SOMETHING REAL BAD HAPPENED')
        print(e)

    if not request.json:
        print("abandon ship!")
        abort(400)

我正在通过 JQuery 向该位置发出 ajax 请求:

    $.ajax({
      url: '/logs',
      contentType: 'application/json',
      type: 'POST',
      data: {'body': 'you know that i could use some body', 'tags': 'tagggssss'},
      success: function(data) {
        console.log(data);
      }.bind(this),
      error: function(xhr, status, err) {
        console.error(this.props.url, status, err.toString());
      }.bind(this)
    });

似乎在尝试访问 request.json 后,Flask 函数立即失败。这是 Flask 服务器输出:

inside /logs POST
===================
X-Requested-With: XMLHttpRequest
Accept-Language: en-US,en;q=0.5
Host: 127.0.0.1:5000
Referer: http://127.0.0.1:5000/
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
Pragma: no-cache
Content-Length: 55
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0
Cache-Control: no-cache


--------------
ImmutableMultiDict([])
--------------
SOMETHING REAL BAD HAPPENED
400: Bad Request
127.0.0.1 - - [11/Apr/2014 13:16:30] "POST /logs HTTP/1.1" 400 -

Flask 文档状态:

如果 mimetype 是 application/json,则此 [request.json,如果我理解正确] 将包含已解析的 JSON 数据。否则这将是无。

这让我相信解析 JSON 会以某种方式失败,尽管我不确定这是怎么回事。我怎样才能看到问题所在?

【问题讨论】:

  • 既然docs应该改用get_json() 方法,你有没有试过改用它?
  • 我确实尝试过(假设我可以将每个 'request.json' 替换为 'request.get_json()'。)我得到完全相同的错误。
  • 您可以在请求中尝试data: JSON.stringify({body: 'you know that i could use some body', tags: 'tagggssss'}), 吗?

标签: jquery python ajax flask


【解决方案1】:

您实际上并没有发布 JSON;只有你的 mimetype 声称你是。使用JSON.stringify()

  data: JSON.stringify({'body': 'you know that i could use some body', 'tags': 'tagggssss'}),

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 2018-12-07
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2011-10-19
    相关资源
    最近更新 更多