如何在Flask中获取发布的json?

我正在尝试使用Flask构build一个简单的API,现在我想在其中读取一些POST JSON。 我使用PostMan Chrome扩展来完成这个职位,而JSON我的职位只是{"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?

您需要将请求内容types设置为application/json以使.json属性可用; 它会是None其他的。 请参阅Flask Request文档 :

如果mimetype是application/json它将包含parsing的JSON数据。 否则这将是None

Flask 0.10添加了request.get_json()方法 ,您应该使用该方法而不是.json属性。 您可以通过设置force=True来告诉方法跳过内容types要求。

请注意,如果此时发生exception (可能导致400错误请求响应),那么您的JSON 数据将无效。 它在某种程度上是畸形的; 你可能想用JSONvalidation器来检查它。

这就是我应该这样做的方式

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

使用silent=True集合时, get_json函数在尝试检索json主体时将自动失败。 默认情况下,它被设置为False 。 设置force=True将忽略request.headers.get('Content-Type') == 'application/json'检查烧瓶为你做。 默认情况下,这也被设置为False 。 请参阅烧瓶文档 。

我会强烈build议leave force=False并让客户端发送Content-Type头来使其更加明确。

希望这可以帮助!

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

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

“json =”input将自动设置内容types,如下所述: 使用Python请求发布JSON

上面的客户端将使用这个服务器端代码:

 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) 

此解决scheme工作:

 from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/hello', methods=['POST']) def hello(): return jsonify(request.json)