如何获取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
:组合args
和form
,如果键重叠,则更喜欢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.data
是werkzeug.ImmutableMultiDict
一个实例。 然后你可以使用g.data
来处理你的大部分需求。 例如,你可以像这样使用它:
@app.route("/something", methods=["POST"]) def do_something(): result = handle(g.data) return jsonify(data=result)
当然,你可以用blueprint
代替app
~~