问题:如何在Flask中获取POST JSON?
我正在尝试使用Flask构建一个简单的API,现在我想在其中读取一些POSTed JSON。我使用Postman Chrome扩展程序执行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"}。有人知道我如何从Flask方法中获取发布的JSON吗?
 
        
        
            
            
            
                
                    I’m trying to build a simple API using Flask, in which I now want to read some POSTed JSON. I do the POST with the Postman Chrome extension, and the JSON I POST is simply {"text":"lalala"}. I try to read the JSON using the following method:
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content
    return uuid
On the browser it correctly returns the UUID I put in the GET, but on the console, it just prints out None (where I expect it to print out the {"text":"lalala"}. Does anybody know how I can get the posted JSON from within the Flask method? 
                 
             
            
         
        
        
回答 0
首先,该.json属性是一个委托给request.get_json()method的属性,该属性记录了为什么None在此处看到。
您需要将请求内容类型设置为,application/json以使.json属性和.get_json()方法(不带参数)起作用,None否则两者都会产生这种情况。请参阅Flask Request文档:
如果mimetype表示JSON(包含application / json,请参见is_json()),则它将包含已解析的JSON数据,否则为None。
您可以request.get_json()通过向其传递force=True关键字参数来告知跳过内容类型要求。
请注意,如果此时引发异常(可能导致400 Bad Request响应),则您的JSON 数据无效。它在某种程度上畸形;您可能需要使用JSON验证程序进行检查。
 
        
        
            
            
            
                
                    First of all, the .json attribute is a property that delegates to the request.get_json() method, which documents why you see None here. 
You need to set the request content type to application/json for the .json property and .get_json() method (with no arguments) to work as either will produce None otherwise. See the Flask Request documentation:
  This will contain the parsed JSON data if the mimetype indicates JSON (application/json, see is_json()), otherwise it will be None.
You can tell request.get_json() to skip the content type requirement by passing it the force=True keyword argument.
Note that if an exception is raised at this point (possibly resulting in a 400 Bad Request response), your JSON data is invalid. It is in some way malformed; you may want to check it with a JSON validator.
                 
             
            
         
        
        
回答 1
作为参考,以下是有关如何从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)
 
        
        
            
            
            
                
                    For reference, here’s complete code for how to send json from a Python client:
import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
    print res.json()
The “json=” input will automatically set the content-type, as discussed here: Post JSON using Python Requests 
And the above client will work with this server-side code:
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
这就是我要做的方法,应该是 
@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'烧瓶对您的 
 检查。默认情况下,它也设置为False。
请参见烧瓶文档。
我强烈建议您离开force=False并让客户端发送Content-Type标头以使其更加明确。
希望这可以帮助!
 
        
        
            
            
            
                
                    This is the way I would do it and it should be 
@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
With silent=True set, the get_json function will fail silently when trying to retrieve the json body. By default this is set to False. If you are always expecting a json body (not optionally), leave it as silent=False.
Setting force=True will ignore the 
request.headers.get('Content-Type') == 'application/json' check that flask does for you. By default this is also set to False. 
See flask documentation.
I would strongly recommend leaving force=False and make the client send the Content-Type header to make it more explicit.
Hope this helps!
                 
             
            
         
        
        
回答 3
假设您已发布具有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)
 
        
        
            
            
            
                
                    Assuming you’ve posted valid JSON with the application/json content type, request.json will have the parsed JSON data.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/echo', methods=['POST'])
def hello():
   return jsonify(request.json)
                 
             
            
         
        
        
回答 4
对于所有问题都是来自ajax调用的人,这里有一个完整的示例:
Ajax调用:这里的关键是使用a 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()
 
        
        
            
            
            
                
                    For all those whose issue was from the ajax call, here is a full example :
Ajax call : the key here is to use a dict and then 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",
    });
And on server side : 
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
给出另一种方法。
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)
 
        
        
            
            
            
                
                    To give another approach.
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)
                 
             
            
         
        
        
回答 6
假设您发布了有效的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)
 
        
        
            
            
            
                
                    Assuming that you have posted valid 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)
                 
             
            
         
        
        
回答 7
尝试使用力参数…
request.get_json(force = True)
 
        
        
            
            
            
                
                    Try to use force parameter…
request.get_json(force = True)
                 
             
            
         
        
        
	
	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。