我试图使用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吗?


当前回答

假设您已经发布了带有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头,使其更显式。

你可以注意到这个要求。json或request.get_json()只在请求头中添加Content-type: application/json时有效。如果你无法改变客户端请求的配置,那么你可以像这样得到json的主体:

data = json.loads(request.data)

尽管我在这里遇到的所有答案都是正确的。有一件事我认为应该做,作为更好的实践。我是这样写的。

from flask import app, request, Flask, jsonify


@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    
    # Check if the request method is POST
    if request.method == 'POST':
        # content will return eather parse data as JSON
        # Or None incase there is no data
        content = request.get_json()
        print(content)
        # The content could be displayed in html page if serialized as json
        return jsonify(content) # Return null if there is content

    # if it is only get request then just return uuid
    return uuid

给出另一种方法。

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

@app.route('/service', methods=['POST'])
def service():
    data = json.loads(request.data)
    text = data.get("text",None)
    if text is None:
        return jsonify({"message":"text not found"})
    else:
        return jsonify(data)

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

假设您已经发布了有效的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)