我正在尝试使用Flask构建一个简单的API,我现在想要阅读一些POSTed JSON。我使用PostMan Chrome extension发布帖子,而我发布的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吗?
答案 0 :(得分:333)
首先,.json
属性是委托给request.get_json()
method的属性,该属性记录了您在此处看到None
的原因。
您需要将application/json
属性和.json
方法(没有参数)的请求内容类型设置为.get_json()
,否则将生成None
。请参阅Flask Request
documentation:
如果mimetype表示JSON( application / json ,请参阅
is_json()
),这将包含已解析的JSON数据,否则它将为None
。
您可以通过传递request.get_json()
关键字参数来告诉force=True
跳过内容类型要求。
请注意,如果此时引发异常(可能导致400 Bad Request响应),则JSON 数据无效。它在某种程度上是畸形的;您可能想要使用JSON验证器进行检查。
答案 1 :(得分:63)
供参考,这里有关于如何从Python客户端发送json的完整代码:
import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
print res.json()
&#34; json =&#34;输入将自动设置内容类型,如下所述: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)
答案 2 :(得分:55)
这就是我这样做的方式,它应该是
@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
。
设置force=True
会忽略
request.headers.get('Content-Type') == 'application/json'
检查烧瓶是否适合你。默认情况下,它也设置为False
。
我强烈建议您离开force=False
并让客户端发送Content-Type
标头以使其更明确。
希望这有帮助!
答案 3 :(得分:15)
此解决方案有效:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/hello', methods=['POST'])
def hello():
return jsonify(request.json)
答案 4 :(得分:11)
对于所有由于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()
答案 5 :(得分:4)
尝试使用力参数...
request.get_json(force = True)
答案 6 :(得分:0)
提供另一种方法。
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)
答案 7 :(得分:0)
假设您已发布有效的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)
答案 8 :(得分:0)
您可能会注意到,仅当在请求的标头中添加了“内容类型:application / json”时,request.json或request.get_json()才起作用。如果您无法更改客户端请求配置,则可以将正文作为json获取,如下所示:
data = json.loads(request.data)
答案 9 :(得分:0)
可以使用以下代码:
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json['text']
print content
return uuid
这是我获取json数据的屏幕截图:
您可以看到返回的是字典类型的数据。
答案 10 :(得分:-1)
我们可以使用Parameters解析json数据
import flask
from flask import request, jsonify
import Parameters
application = flask.Flask(__name__)
@application.route('/myappp', methods=['POST'])
@cross_origin('*')
def User_details_by_mailID():
payload = request.get_json()
email = payload[Parameters.email]
return jsonify(email)