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


当前回答

对于所有那些问题来自ajax调用的人,这里有一个完整的例子:

Ajax调用:这里的关键是使用dict,然后使用JSON.stringify

    var dict = {username : "username" , password:"password"};

    $.ajax({
        type: "POST", 
        url: "http://127.0.0.1:5000/", //localhost Flask
        data : JSON.stringify(dict),
        contentType: "application/json",
    });

在服务器端:

from flask import Flask
from flask import request
import json

app = Flask(__name__)

@app.route("/",  methods = ['POST'])
def hello():
    print(request.get_json())
    return json.dumps({'success':True}), 200, {'ContentType':'application/json'} 

if __name__ == "__main__":
    app.run()

其他回答

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

data = json.loads(request.data)

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

首先,.json属性是委托给request.get_json()方法的属性,该方法记录了为什么在这里看到None。

你需要为.json属性和.get_json()方法(不带参数)设置请求内容类型为application/json,否则两者都会产生None。参见Flask Request文档:

如果mimetype指示JSON (application/ JSON,请参阅is_json()),则它将包含已解析的JSON数据,否则将为None。

您可以告诉request.get_json()通过传递force=True关键字参数来跳过内容类型要求。

注意,如果此时引发异常(可能导致400个Bad Request响应),则JSON数据无效。它在某种程度上是畸形的;你可能想用JSON验证器检查它。

给出另一种方法。

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)

作为参考,以下是如何从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)