如何在 Flask 中获取 POSTed JSON?

问题描述 投票:0回答:13

我正在尝试使用 Flask 构建一个简单的 API,现在我想在其中读取一些 POSTed JSON。我使用 Postman Chrome 扩展进行 POST,我 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"}
)。有谁知道我如何获取发布的 JSON从 Flask 方法中?

python json post flask
13个回答
633
投票
首先,

.json

属性是委托给
request.get_json()
方法
的属性,它记录了为什么你会在这里看到
None

您需要将请求内容类型设置为

application/json

 才能使 
.json
 属性和 
.get_json()
 方法(不带参数)正常工作,否则都会产生 
None
。请参阅 
Flask Request
 文档

如果

mimetype

表示JSON,则解析的JSON数据(
application/json
,参见
.is_json
)。

您可以通过传递

request.get_json()

 关键字参数来告诉 
force=True
 跳过内容类型要求。

请注意,如果此时引发

异常(可能导致 415 不支持的媒体类型响应),则您的 JSON 数据 无效。它在某种程度上是畸形的;您可能需要使用 JSON 验证器来检查它。


210
投票
作为参考,这里是如何从 Python 客户端发送 json 的完整代码:

import requests res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"}) if res.ok: print(res.json())
“json=”输入将自动设置内容类型,如下所述:

How to POST JSON data with 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)
    

95
投票
这就是我要做的,也应该是这样的

@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
。如果您总是期望 json 正文(不是可选的),请将其保留为 
silent=False

设置

force=True

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

请参阅

flask 文档

我强烈建议保留

force=False

 并让客户端发送 
Content-Type
 标头以使其更加明确。


36
投票
假设您已发布具有

application/json

 内容类型的有效 JSON,
request.json
 将具有已解析的 JSON 数据。

from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/echo', methods=['POST']) def hello(): return jsonify(request.json)
    

17
投票
对于所有问题来自 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()
    

12
投票
如果您使用

force=True

,它将忽略请求的内容类型并尝试将正文解析为 JSON。

request.get_json(force=True)
    

11
投票
您可能会注意到,仅当

request.json

 已添加到请求标头中时,
request.get_json()
Content-type: application/json
 才起作用。如果您无法更改客户端请求配置,那么您可以像这样获取 json 正文:

data = json.loads(request.data)
    

6
投票
提供另一种方法。

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)
    

2
投票
可以使用以下代码:

@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

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


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

1
投票
尽管我在这里遇到的所有答案都是正确的。我认为有些事情应该作为更好的实践来完成。这是我的写法。

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
    

0
投票
{ "uuid":1212121212, "text":"lalala", "comment":"", "signed_on":"2022-11-07 00:03:00" }

您可以将上述数据作为 json 发送,并使用 request.json 在 Flask 应用程序中获取它

from flask import request, Blueprint,flash,json @app.route('/api/add_message/<uuid>', methods = ["GET", "POST"]) def testing(uuid): sync_data = request.json josn_data = json.dumps(sync_data ,default =str) return josn_data
    

-1
投票
尝试在

force

 方法中将 
True
 属性设置为 
get_json()
 来解决此问题。

request.get_json(force = True)
    
© www.soinside.com 2019 - 2024. All rights reserved.