如何在Flask中发布JSON?

2024-03-28 10:13:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Flask构建一个简单的API,现在我想在其中阅读一些发布的JSON。我使用Postman Chrome扩展来完成POST,而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吗?


Tags: 方法textaddapijsonappflaskmessage
3条回答

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

我就是这么做的

@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'检查烧瓶是否适合您。默认情况下,这也设置为False

flask documentation

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

希望这有帮助!

首先,.json属性是一个委托给^{} method的属性,它记录了在这里看到None的原因。

您需要将请求内容类型设置为application/json,以便.json属性和.get_json()方法(不带参数)工作,否则两者都将生成None。请参见Flask ^{} documentation

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验证器来检查它。

相关问题 更多 >