关于python:如何在flask中发布json?

How to get POSTed json in Flask?

我正在尝试使用flask构建一个简单的API,现在我想在其中阅读一些已发布的JSON。我使用postman chrome扩展来完成post,而json i post只是{"text":"lalala"}。我尝试使用以下方法读取JSON:

1
2
3
4
5
@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吗?


首先,.json属性已经被否决,您应该使用request.get_json()方法。

您需要将请求内容类型设置为application/json,以便.json属性和.get_json()方法工作;否则,要么生成None。见烧瓶Request文件:

This will contain the parsed JSON data if the mimetype indicates JSON (application/json, see is_json()), otherwise it will be None.

通过设置force=True,可以告诉request.get_json()跳过内容类型要求。

请注意,如果此时引发异常(可能导致400个错误的请求响应),则JSON数据无效。它在某种程度上是格式错误的;您可能需要用JSON验证器检查它。


下面是如何从Python客户机发送JSON的完整代码,供参考:

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

"json="input将自动设置内容类型,如下所述:使用python请求发布json

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

1
2
3
4
5
6
7
8
9
10
11
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)


这就是我应该做的

1
2
3
4
5
@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后,当试图检索JSON主体时,get_json功能将自动失败。默认设置为False

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

见烧瓶文件。

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

希望这有帮助!


此解决方案有效:

1
2
3
4
5
6
7
8
from flask import Flask, request, jsonify

app = Flask(__name__)


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