我试图使用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吗?
首先,.json属性是委托给request.get_json()方法的属性,该方法记录了为什么在这里看到None。
你需要为.json属性和.get_json()方法(不带参数)设置请求内容类型为application/json,否则两者都会产生None。参见Flask Request文档:
如果mimetype指示JSON (application/ JSON,请参阅is_json()),则它将包含已解析的JSON数据,否则将为None。
您可以告诉request.get_json()通过传递force=True关键字参数来跳过内容类型要求。
注意,如果此时引发异常(可能导致400个Bad Request响应),则JSON数据无效。它在某种程度上是畸形的;你可能想用JSON验证器检查它。
作为参考,以下是如何从Python客户端发送json的完整代码:
import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
print(res.json())
“json=”输入将自动设置内容类型,如这里所讨论的:如何POST json数据与Python请求?
上面的客户端将与服务器端代码一起工作:
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, get_json函数在试图检索json主体时将会无声地失败。默认设置为False。如果你总是期望json主体(不是可选的),让它为silent=False。
设置force=True将忽略
request.headers.get('Content-Type') == 'application/json'检查flask为你做的。默认情况下,它也被设置为False。
参见flask文档。
我强烈建议留下force=False,并让客户端发送Content-Type头,使其更显式。
尽管我在这里遇到的所有答案都是正确的。有一件事我认为应该做,作为更好的实践。我是这样写的。
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
首先,.json属性是委托给request.get_json()方法的属性,该方法记录了为什么在这里看到None。
你需要为.json属性和.get_json()方法(不带参数)设置请求内容类型为application/json,否则两者都会产生None。参见Flask Request文档:
如果mimetype指示JSON (application/ JSON,请参阅is_json()),则它将包含已解析的JSON数据,否则将为None。
您可以告诉request.get_json()通过传递force=True关键字参数来跳过内容类型要求。
注意,如果此时引发异常(可能导致400个Bad Request响应),则JSON数据无效。它在某种程度上是畸形的;你可能想用JSON验证器检查它。