我试图使用Flask构建一个简单的API,在其中我现在想读取一些post JSON。我用邮递员Chrome扩展做POST, JSON I POST只是{"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吗?
{
"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
对于所有那些问题来自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()
我就会这么做,也应该这样
@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'检查flask为你做的。默认情况下,它也被设置为False。
参见flask文档。
我强烈建议留下force=False,并让客户端发送Content-Type头,使其更显式。