我正在尝试使用 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 方法中?
.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 验证器来检查它。
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)
@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
标头以使其更加明确。
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)
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()
force=True
,它将忽略请求的内容类型并尝试将正文解析为 JSON。
request.get_json(force=True)
request.json
已添加到请求标头中时,
request.get_json()
或
Content-type: application/json
才起作用。如果您无法更改客户端请求配置,那么您可以像这样获取 json 正文:
data = json.loads(request.data)
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)
@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)
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
{
"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
force
方法中将
True
属性设置为
get_json()
来解决此问题。
request.get_json(force = True)