如何在 Flask 中获取 POST 的 JSON?
- 2024-11-22 08:47:00
- admin 原创
- 7
问题描述:
我正在尝试使用 Flask 构建一个简单的 API,现在我想在其中读取一些 POST 的 JSON。我使用 Postman Chrome 扩展程序进行 POST,我 POST 的 JSON 很简单{"text":"hello world"}
。我尝试使用以下方法读取 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":"hello world"}
。有人知道如何从 Flask 方法中获取发布的 JSON 吗?
解决方案 1:
首先,.json
属性是一种委托给request.get_json()
方法的属性,这记录了您None
在这里看到的原因。
您需要将请求内容类型设置为,application/json
以使.json
属性和.get_json()
方法(无参数)正常工作,否则将产生结果None
。请参阅FlaskRequest
文档:
解析后的 JSON 数据若
mimetype
指示 JSON(application/json
,请参阅.is_json
)。
您可以request.get_json()
通过传递force=True
关键字参数来跳过内容类型要求。
请注意,如果此时出现异常(可能导致 415 Unsupported Media Type 响应),则您的 JSON数据无效。它在某种程度上是格式错误的;您可能需要使用 JSON 验证器进行检查。
解决方案 2:
作为参考,下面是如何从 Python 客户端发送 json 的完整代码:
import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
print(res.json())
“json=”输入将自动设置内容类型,如下所述:如何使用 Python 请求发布 JSON 数据?
上述客户端将与该服务器端代码一起工作:
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)
解决方案 3:
我会这样做,也应该这样做
@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
set 后,get_json
函数在尝试检索 json 主体时将默默失败。默认情况下,此设置为False
。如果您始终期望 json 主体(不是可选的),请将其保留为silent=False
。
设置force=True
将忽略request.headers.get('Content-Type') == 'application/json'
flask 为您执行的检查。默认情况下,这也设置为False
。
参见Flask 文档。
我强烈建议离开force=False
并让客户端发送Content-Type
标题以使其更加明确。
解决方案 4:
假设您已经发布了具有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)
解决方案 5:
对于那些问题来自 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()
解决方案 6:
如果您使用force=True
,它将忽略请求的内容类型并尝试将正文解析为 JSON。
request.get_json(force=True)
解决方案 7:
您可能会注意到,仅当在请求的标头中添加了时request.json
,或才有效。如果您无法更改客户端请求配置,则可以像这样获取 JSON 格式的正文:request.get_json()
`Content-type: application/json`
data = json.loads(request.data)
解决方案 8:
给出另一种方法。
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)
解决方案 9:
可以使用如下代码:
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json['text']
print content
return uuid
下面是我获取json数据的截图:
可以看到返回的是字典类型的数据。
解决方案 10:
假设您已发布有效的 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)
解决方案 11:
尽管我在这里遇到的所有答案都是正确的。但我认为应该做一些事情作为更好的做法。以下是我写的方法。
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
解决方案 12:
{
"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
解决方案 13:
尝试按照方法设置force
属性来解决此问题。True
`get_json()`
request.get_json(force = True)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件