在Flask请求中获取接收到的数据

1250

我想能够获取发送到我的Flask应用程序的数据。我已尝试访问request.data,但它是一个空字符串。您如何访问请求数据?

from flask import request

@app.route('/', methods=['GET', 'POST'])
def parse_request():
    data = request.data  # data is empty
    # need posted data here
这个问题的答案引导我提出了下一个问题:如何在Python Flask中获取无论Content-Type头文件类型如何都能获取到原始POST请求体,它是关于获取原始数据而不是解析数据的。
25个回答

2177

文档描述了请求期间request对象(from flask import request)上可用的属性。在大多数情况下,request.data为空,因为它被用作后备:

request.data包含了请求数据的字符串形式,假如它具有Flask不处理的MIME类型。

  • request.args:URL查询字符串中的键值对
  • request.form:来自HTML表单、JavaScript请求的主体中的键值对,而且没有进行JSON编码
  • request.files:主体中的文件,Flask将其与form分开。HTML表单必须使用enctype=multipart/form-data,否则文件将无法上传。
  • request.values:组合argsform,如果键重叠则优先使用args
  • request.json:解析的JSON数据。请求必须具有application/json内容类型,或使用request.get_json(force=True)来忽略内容类型。

这些都是MultiDict实例(除了json)。您可以使用以下方式访问值:

  • request.form['name']:如果您知道键存在,请使用索引
  • request.form.get('name'):如果键可能不存在,请使用get
  • request.form.getlist('name'):如果键被多次发送并且您想要值列表,请使用getlistget仅返回第一个值。

1
我发现当请求的Content-Type设置为application/json时,request.datarequest.json都会被填充。因此,看起来它不仅仅是一个备选项,而且即使在Flask处理的MIME类型中,它也会被填充。如果我理解有误,请纠正我。 - R.S.K
1
我发现当请求的Content-Type设置为application/json时,request.datarequest.json都会被填充。因此,看起来它不仅仅是一个备选项,而且即使在Flask处理的mimetypes中,它也会被填充。如果我理解有误,请纠正我。 - undefined

298

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

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

对于提交的表单输入,请使用request.form

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

对于使用内容类型为 application/json 的 JSON,使用 request.get_json()

data = request.get_json()

272

使用request.data来获取原始数据。只有在它不能被解析为表单数据时,才能使用此方法,否则它将为空,而request.form将包含已解析的数据。

from flask import request
request.data

现在这种行为已经改变了,因为我发现request.data即使是表单数据,也确实包含原始数据。 - R.S.K
现在这种行为已经改变了,因为我发现request.data即使是表单数据,也确实包含原始数据。 - undefined

170

这里是解析已发布的JSON数据并将其回显的示例。

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/foo', methods=['POST']) 
def foo():
    data = request.json
    return jsonify(data)

使用curl发布JSON:

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

或者使用Postman:

使用Postman发送JSON


87

要获取原始的帖子正文,不考虑内容类型,请使用request.get_data()。如果您使用request.data,它会调用request.get_data(parse_form_data=True),这将填充request.form MultiDict并使data为空。


1
这个应该得到更多的赞。我们可以使用request.get_data()来获取表单或JSON数据,而不必区分它们。 - R.S.K
我正在寻找这个解决方案。 - user582175
request.method == 'GET': 时,使用 request.get_data() 对我来说不起作用。我发现 request.args 可以解决问题。 - Brad Grissom
request.method == 'GET'时,使用request.get_data()对我来说不起作用。我发现使用request.args可以解决这个问题。 - Brad Grissom
@BradGrissom 这是因为查询字符串永远不会出现在 request.data 中;查询字符串是URL的一部分,而不是实体主体。 - TheTechRobo the Nerd
这个解决方案是有效的,如果你需要以字符串格式获取数据,可以使用request.get_data().decode("utf-8")将字节转换为字符串。 - Amir Zare

57

如果您使用内容类型 application/json 发布 JSON,请在 Flask 中使用 request.get_json() 获取它。如果内容类型不正确,则返回 None 。如果数据不是 JSON,则会引发错误。

@app.route("/something", methods=["POST"])
def do_something():
    data = request.get_json()

39

要将request.form作为普通字典获取,使用request.form.to_dict(flat=False)

要返回API的JSON数据,请将其传递给jsonify

此示例将表单数据作为JSON数据返回。

@app.route('/form_to_json', methods=['POST'])
def form_to_json():
    data = request.form.to_dict(flat=False)
    return jsonify(data)

以下是使用curl POST表单数据的示例,返回JSON格式:

$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
  "name": "ivanleoncz", 
  "role": "Software Developer"
}

31

您可以从以下位置获取请求数据:

  1. request.form 用于表单数据,包括表单和文件数据,
  2. request.jsonrequest.get_json 用于 JSON 数据
  3. request.headers 获取头信息
  4. request.args 获取查询参数

它们都像字典一样,如果您知道键存在,使用 request.form['name'],或者如果它是可选的,则使用 request.form.get('name')


27

使用request.get_json()来获取发布的JSON数据。

data = request.get_json()
name = data.get('name', '')

使用request.form在提交POST方法表单时获取数据。

name = request.form.get('name', '')
使用request.args来获取传递在URL查询字符串中的数据,例如使用GET方法提交表单。
request.args.get("name", "")

request.form等类似字典,可使用get方法获取传递的默认值。


26

导入请求:

from flask import request

URL查询参数:

name = request.args.get("name")
age = request.args.get("age")

表单输入:

name = request.form.get('name')
age = request.form.get('age')

如果您知道键存在,可以使用索引,或者指定输入字段的名称。

name = request.form['name']
age = request.form['age']

JSON数据(适用于内容类型应用程序/JSON

data = request.get_json()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接