如何获取Flask请求中收到的数据

我希望能够将数据发送到我的Flask应用程序。 我试过访问request.data但是它是一个空string。 你如何访问请求数据?

 @app.route('/', methods=['GET', 'POST']) def parse_request(): data = request.data # data is empty # need posted data here 

这个问题的答案导致我要求在Python Flask中获取原始POST主体,而不pipeContent-Type头是什么,这是关于获取原始数据而不是parsing数据。

文档描述了请求中可用的属性。 在大多数情况下, request.data将是空的,因为它被用作回退:

request.data包含传入的请求数据作为string,以防带有mimetype Flask不处理。

  • request.args :URL查询string中的键/值对
  • request.form :正文中的键/值对,来自HTMLpost表单或未经JSON编码的JavaScript请求
  • request.files :Flask与form保持独立的正文中的文件。 HTML表单必须使用enctype=multipart/form-data或者文件不会被上传。
  • request.values :组合argsform ,如果键重叠,则更喜欢args
 from flask import request request.data 

简言之如下

对于URL查询参数 ,请使用request.args

 search = request.args.get("search") page = request.args.get("page") 

对于表单input ,请使用request.form

 email = request.form.get('email') password = request.form.get('password') 

对于数据typesapplication / json ,请使用request.data

 # data in string format and you have to parse into dictionary data = request.data dataDict = json.loads(data) 

我举一个完整的application / json的例子:

 from flask import Flask, abort, request import json app = Flask(__name__) @app.route('/foo', methods=['POST']) def foo(): if not request.json: abort(400) print request.json return json.dumps(request.json) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) 

使用PostMan进行发布请求:

在这里输入图像描述

使用curl命令:

 curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo 

PS对于URL查询参数的例子,你可以在Flask approute的多个参数中看到我的答案

Flask还有另一个JSON的快捷方式:

标题:

 {Content-Type: application/json} @app.route("/something", methods=["POST"]) def do_something(): data = request.get_json() 

如果你想要不pipe内容types的原始文章体,你应该使用request.get_data() ,因为request.form被转换为werkzeug.ImmutableMultiDict格式。

 len = request.headers["Content-Length"] data=request.stream.read() 

现在,数据是请求的主体

简而言之,您可以通过以下方式获取数据:

 @app.before_request def before_request(): g.data = request.get_json() or request.values 

现在, g.datawerkzeug.ImmutableMultiDict一个实例。 然后你可以使用g.data来处理你的大部分需求。 例如,你可以像这样使用它:

 @app.route("/something", methods=["POST"]) def do_something(): result = handle(g.data) return jsonify(data=result) 

当然,你可以用blueprint代替app ~~