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

我试图用Flask构建一个简单的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?


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

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

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

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


这是我会这样做的方式,它应该是

@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 。 请参阅烧瓶文档。

我强烈建议离开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 =”输入将自动设置内容类型,如下所述:使用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)
链接地址: http://www.djcxy.com/p/20127.html

上一篇: How to get POSTed json in Flask?

下一篇: style comments in JSON