首页 文章

如何在Flask中获得POSTed json?

提问于
浏览
203

我正在尝试使用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 ?

4 回答

  • 51

    您需要将请求内容类型设置为 application/json 才能使 .json 属性生效;否则它将是 None . 见Flask Request documentation

    如果mimetype是application / json,则它将包含已解析的JSON数据 . 否则这将是None .

    Flask 0.10添加了request.get_json() method,您应该使用该方法而不是 .json 属性 . 您可以通过设置 force=True 来告诉方法跳过内容类型要求 .

    请注意,如果此时引发异常(可能导致400 Bad Request响应),则JSON数据无效 . 它在某种程度上是畸形的;您可能想要使用JSON验证器进行检查 .

  • 281

    作为参考,这里有关于如何从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 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)
    
  • 48

    这就是我应该这样做的方式

    @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 .

    flask documentation .

    我强烈建议离开 force=False 并让客户端发送 Content-Type 标头以使其更明确 .

    希望这可以帮助!

  • 8

    该解决方案有效:

    from flask import Flask, request, jsonify
    
    app = Flask(__name__)
    
    
    @app.route('/hello', methods=['POST'])
    def hello():
       return jsonify(request.json)
    

相关问题