如何在Flask中获得POST的json?

时间:2013-11-15 12:35:20

标签: python json post flask

我正在尝试使用Flask构建一个简单的API,我现在想要阅读一些POSTed JSON。我使用PostMan Chrome extension发布帖子,而我发布的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吗?

11 个答案:

答案 0 :(得分:333)

首先,.json属性是委托给request.get_json() method的属性,该属性记录了您在此处看到None的原因。

您需要将application/json属性和.json方法(没有参数)的请求内容类型设置为.get_json(),否则将生成None。请参阅Flask Request documentation

  

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

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

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

答案 1 :(得分:63)

供参考,这里有关于如何从Python客户端发送json的完整代码:

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

&#34; json =&#34;输入将自动设置内容类型,如下所述:Post JSON using Python Requests

以上客户端将使用此服务器端代码:

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)

答案 2 :(得分:55)

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

@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

设置force=True会忽略 request.headers.get('Content-Type') == 'application/json'检查烧瓶是否适合你。默认情况下,它也设置为False

请参阅flask documentation

我强烈建议您离开force=False并让客户端发送Content-Type标头以使其更明确。

希望这有帮助!

答案 3 :(得分:15)

此解决方案有效:

from flask import Flask, request, jsonify

app = Flask(__name__)


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

答案 4 :(得分:11)

对于所有由于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()

答案 5 :(得分:4)

尝试使用力参数...

request.get_json(force = True)

答案 6 :(得分:0)

提供另一种方法。

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)

答案 7 :(得分:0)

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

答案 8 :(得分:0)

您可能会注意到,仅当在请求的标头中添加了“内容类型:application / json”时,request.json或request.get_json()才起作用。如果您无法更改客户端请求配置,则可以将正文作为json获取,如下所示:

data = json.loads(request.data)

答案 9 :(得分:0)

可以使用以下代码:

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

这是我获取json数据的屏幕截图:

enter image description here

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

答案 10 :(得分:-1)

我们可以使用Parameters解析json数据

import flask
from flask import request, jsonify
import Parameters

application = flask.Flask(__name__)

@application.route('/myappp', methods=['POST'])
    @cross_origin('*')
    def User_details_by_mailID():
        payload = request.get_json()
        email = payload[Parameters.email]
        return jsonify(email)