1070

我希望能够将数据发送到我的 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 中获取原始 POST 正文,而不考虑接下来的 Content-Type 标头,这是关于获取原始数据而不是解析数据。

4

23 回答 23

1893

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

request.data包含传入的请求数据作为字符串,以防它带有 Flask 无法处理的 mimetype。

  • request.args: URL 查询字符串中的键/值对
  • request.form: 正文中的键/值对,来自 HTML 发布表单或非 JSON 编码的 JavaScript 请求
  • request.files: 正文中的文件,Flask 与form. 必须使用 HTML 表单enctype=multipart/form-data,否则将无法上传文件。
  • request.values: 组合argsand form,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')getlist如果密钥被多次发送并且您想要一个值列表,请使用。get只返回第一个值。
于 2013-05-21T07:25:07.400 回答
257

要获取原始数据,请使用request.data. 这仅在无法解析为表单数据时才有效,否则它将为空并request.form具有解析的数据。

from flask import request
request.data
于 2012-05-03T15:38:22.940 回答
248

对于 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')

对于以内容类型发布的 JSON application/json,请使用request.get_json().

data = request.get_json()
于 2014-08-12T15:22:24.467 回答
146

这是解析发布的 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

或者使用邮递员:

使用邮递员发布 JSON

于 2016-11-16T03:55:33.723 回答
57

无论内容类型如何,要获取原始帖子正文,请使用request.get_data(). 如果您使用request.data,它会调用request.get_data(parse_form_data=True),这将填充request.form MultiDictdata留空。

于 2015-08-14T07:29:47.500 回答
50

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

@app.route("/something", methods=["POST"])
def do_something():
    data = request.get_json()
于 2015-07-27T13:06:14.713 回答
31

要获取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"
}
于 2018-06-06T19:54:19.423 回答
23

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

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

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

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

用于request.args获取在 URL 的查询字符串中传递的数据,例如使用 GET 方法提交表单时。

request.args.get("name", "")

request.form等是类似dict的,get如果没有通过,则使用该方法获取具有默认值的值。

于 2019-03-10T07:32:28.593 回答
19

要获取没有application/json内容类型的 JSON 发布,请使用request.get_json(force=True).

@app.route('/process_data', methods=['POST'])
def process_data():
    req_data = request.get_json(force=True)
    language = req_data['language']
    return 'The language value is: {}'.format(language)
于 2018-03-25T14:45:06.980 回答
17

要在 JavaScript 中使用 jQuery 发布 JSON,请使用JSON.stringify转储数据,并将内容类型设置为application/json.

var value_data = [1, 2, 3, 4];

$.ajax({
    type: 'POST',
    url: '/process',
    data: JSON.stringify(value_data),
    contentType: 'application/json',
    success: function (response_data) {
        alert("success");
    }   
});

在 Flask 中用request.get_json().

data = request.get_json()
于 2018-05-11T13:58:21.030 回答
15

原始数据从 WSGI 服务器以request.stream. 流的长度在Content-Length标头中。

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

使用它通常更安全request.get_data()

于 2016-07-11T15:46:11.720 回答
15

导入请求:

from flask import request

网址查询参数:

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 数据(对于内容类型application/json

data = request.get_json()
于 2021-05-09T20:03:53.860 回答
14

这是发布表单数据以将用户添加到数据库的示例。检查request.method == "POST"表单是否已提交。使用 key fromrequest.form获取表单数据。使用 else 渲染 HTML 模板<form>。表单中的字段应具有name与 中的键匹配的属性request.form

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route("/user/add", methods=["GET", "POST"])
def add_user():
    if request.method == "POST":
        user = User(
            username=request.form["username"],
            email=request.form["email"],
        )
        db.session.add(user)
        db.session.commit()
        return redirect(url_for("index"))

    return render_template("add_user.html")
<form method="post">
    <label for="username">Username</label>
    <input type="text" name="username" id="username">
    <label for="email">Email</label>
    <input type="email" name="email" id="email">
    <input type="submit">
</form>
于 2019-10-11T02:57:46.017 回答
12

要解析 JSON,请使用request.get_json().

@app.route("/something", methods=["POST"])
def do_something():
    result = handle(request.get_json())
    return jsonify(data=result)
于 2017-08-22T12:46:38.470 回答
11

在编写一个应该发送 JSON 数据的 Slack 机器人时,我得到了一个有效Content-Type载荷application/x-www-form-urlencoded

我试过request.get_json()了,但没有用。

@app.route('/process_data', methods=['POST'])
def process_data():
   req_data = request.get_json(force=True)

相反,我曾经request.form获取包含JSON 的表单数据字段,然后加载它。

from flask import json

@ app.route('/slack/request_handler', methods=['POST'])
def request_handler():
   req_data = json.loads(request.form["payload"])
于 2020-09-24T04:13:43.987 回答
9

如果内容类型被识别为表单数据,request.data则将其解析为request.form并返回一个空字符串。

无论内容类型如何,要获取原始数据,请调用request.get_data(). request.data调用get_data(parse_form_data=True),而默认情况下是False直接调用它。

于 2018-08-21T22:52:42.560 回答
9

如果正文被识别为表单数据,它将在request.form. 如果是 JSON,它将在request.get_json(). 否则原始数据将在request.data. 如果您不确定如何提交数据,您可以使用or链来获取第一个带有数据的数据。

def get_request_data():
    return (
        request.args
        or request.form
        or request.get_json(force=True, silent=True)
        or request.data
    )

request.argsget_request_data()包含从查询字符串中解析的 args,无论正文中有什么,因此如果它和正文都应同时数据,您将从中删除它。

于 2018-12-01T05:04:39.710 回答
5

使用 HTML 表单发布表单数据时,请确保input标签具有name属性,否则它们将不会出现在request.form.

@app.route('/', methods=['GET', 'POST'])
def index():
    print(request.form)
    return """
<form method="post">
    <input type="text">
    <input type="text" id="txt2">
    <input type="text" name="txt3" id="txt3">  
    <input type="submit">
</form>
"""
ImmutableMultiDict([('txt3', 'text 3')])

只有txt3输入有一个name,所以它是唯一存在的键request.form

于 2018-08-20T15:45:46.033 回答
5
@app.route('/addData', methods=['POST'])
def add_data():
     data_in = mongo.db.Data
     id = request.values.get("id")
     name = request.values.get("name")
     newuser = {'id' : id, 'name' : name}
     if voter.find({'id' : id, 'name' : name}).count() > 0:
            return "Data Exists"
     else:
            data_in.insert(newuser)
            return "Data Added"
于 2020-07-21T10:54:38.513 回答
4

您可以从

  1. request.form对于表单数据,这包括表单和文件数据,
  2. request.json对于JSONrequest.get_json数据
  3. request.headers用于标题
  4. request.args获取查询参数

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

于 2021-11-12T10:45:01.990 回答
-1

我只是面临同样的需求。我必须保存信息以防出现任何意外情况。所以,我使用以下公式:

Info = "%s/%s/%s" % (request.remote_addr, repr(request), repr(session))

repr(request) 将给出基本信息的字符串表示。您可以使用以下命令添加用户代理数据: request.headers.get('User-Agent')

我还保存了会话大陆,因为它可能包含有价值的信息

于 2021-12-27T13:10:56.113 回答
-2

试试——>

from flask import request

@app.route('/', methods=['GET', 'POST'])
def parse_request():
    if request.method == 'POST':
       data = request.form.get('data')
于 2021-10-13T14:11:39.483 回答
-3
request.data

这很好用,但请记住它是以字符串形式出现的,需要迭代。

于 2020-10-09T08:29:43.233 回答