我试图使用Flask构建一个简单的API,在其中我现在想读取一些post JSON。我用邮递员Chrome扩展做POST, JSON I POST只是{"text":"lalala"}。我尝试使用以下方法读取JSON:

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content
    return uuid

在浏览器上,它正确地返回我放入GET中的UUID,但在控制台上,它只是打印出None(我希望它打印出{"text":"lalala"})。有人知道我如何从Flask方法中获得发布的JSON吗?


当前回答

假设您已经发布了有效的JSON,

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content['uuid']
    # Return data as JSON
    return jsonify(content)

其他回答

可以使用以下代码:

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
  content = request.json['text']
  print content
  return uuid

这是我得到json数据的截图:

您可以看到返回的是字典类型的数据。

如果使用force=True,它将忽略请求的内容类型,并尝试将正文解析为JSON。

request.get_json(force=True)

作为参考,以下是如何从Python客户端发送json的完整代码:

import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
    print(res.json())

“json=”输入将自动设置内容类型,如这里所讨论的:如何POST json数据与Python请求?

上面的客户端将与服务器端代码一起工作:

from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print(content['mytext'])
    return jsonify({"uuid":uuid})

if __name__ == '__main__':
    app.run(host= '0.0.0.0',debug=True)

假设您已经发布了带有application/ JSON内容类型的有效JSON,请求。json将有解析的json数据。

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/echo', methods=['POST'])
def hello():
   return jsonify(request.json)

我就会这么做,也应该这样

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.get_json(silent=True)
    # print(content) # Do your processing
    return uuid

如果设置为silent=True, get_json函数在试图检索json主体时将会无声地失败。默认设置为False。如果你总是期望json主体(不是可选的),让它为silent=False。

设置force=True将忽略 request.headers.get('Content-Type') == 'application/json'检查flask为你做的。默认情况下,它也被设置为False。

参见flask文档。

我强烈建议留下force=False,并让客户端发送Content-Type头,使其更显式。