如何在Flask请求中获取数据

ddi*_*hev 623 python werkzeug flask

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

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

这个问题的答案促使我在Python Flask中询问获取原始POST主体,而不管接下来是Content-Type标头,这是关于获取原始数据而不是解析数据.

Rob*_*ert 1034

文档描述的要求提供的属性.在大多数常见情况下,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:组合,args并且form,args如果键重叠,则更喜欢

所有这些都是request.json实例.您可以使用以下方法访问值

  • application/json:如果您知道密钥存在,请使用索引
  • request.get_json(force=True):MultiDict如果密钥可能不存在,请使用
  • json:request.form['name']如果密钥被多次发送并且您想要一个值列表,请使用.request.form.get('name')只返回第一个值.

  • @e-info128,您必须从flask导入“request”对象:“fromflask import request” (7认同)

cly*_*ish 189

from flask import request
request.data
Run Code Online (Sandbox Code Playgroud)


Fiz*_*han 163

它简单如下

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

search = request.args.get("search")
page = request.args.get("page")
Run Code Online (Sandbox Code Playgroud)

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

email = request.form.get('email')
password = request.form.get('password')
Run Code Online (Sandbox Code Playgroud)

对于数据类型application/json,请使用request.data

data = request.get_json()
Run Code Online (Sandbox Code Playgroud)


Lit*_*oys 80

我给出了application/json的完整示例:

from flask import Flask, request, jsonify

app = Flask(__name__)

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

使用Postman邮寄请求:

在此输入图像描述

使用curl命令:

curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo
Run Code Online (Sandbox Code Playgroud)

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


小智 33

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

标题:

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


小智 31

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

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

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


Xia*_*iao 26

如果你想要原始的帖子体而不管内容类型,你应该使用request.get_data(),因为request.data转换为request.get_data(parse_form_data=True)格式.


Mur*_*rad 26

导入请求:

from flask import request
Run Code Online (Sandbox Code Playgroud)

网址查询参数:

name = request.args.get("name")
age = request.args.get("age")
Run Code Online (Sandbox Code Playgroud)

表单输入:

name = request.form.get('name')
age = request.form.get('age')
Run Code Online (Sandbox Code Playgroud)

OR(如果您知道键存在,请使用索引,指定输入字段的名称

name = request.form['name']
age = request.form['age']
Run Code Online (Sandbox Code Playgroud)

JSON 数据(对于内容类型application/json

data = request.get_json()
Run Code Online (Sandbox Code Playgroud)


小智 16

要在 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");
    }   
});
Run Code Online (Sandbox Code Playgroud)

在 Flask 中使用request.get_json().

data = request.get_json()
Run Code Online (Sandbox Code Playgroud)


iva*_*ncz 12

request.form.

request.form.to_dict(flat=False)您可以通过解析MultiDictjsonify对象提供的内容来获取所有发布的数据,而不是获取单个表单数据(),如下所示:

烧瓶(路线)

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

贝壳

$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
  "name": "ivanleoncz", 
  "role": "Software Developer"
}
Run Code Online (Sandbox Code Playgroud)

更多细节,这个要点.


小智 12

这是发布表单数据以将用户添加到数据库的示例。检查request.method == "POST"以检查表单是否已提交。使用来自的键request.form来获取表单数据。使用<form>其他方式呈现 HTML 模板。表单中的字段应具有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")
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


小智 10

@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)
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 8

length = request.headers["Content-Length"]
data = request.stream.read(length)
Run Code Online (Sandbox Code Playgroud)

现在,数据是请求体


zha*_*gqy 8

简单来说,您可以通过以下方式获取数据:

@app.route("/something", methods=["POST"])
def do_something():
    result = handle(request.get_json())
    return jsonify(data=result)
Run Code Online (Sandbox Code Playgroud)

现在,request.get_json()是一个实例request.get_json().然后您可以使用request.get_json()哪个可以满足您的大部分要求.例如,您可以像这样使用它:

@app.route("/something", methods=["POST"])
def do_something():
    result = handle(request.get_json())
    return jsonify(data=result)
Run Code Online (Sandbox Code Playgroud)

当然,你可以用request.get_json()而不是request.get_json()~~


Pau*_*der 8

如果正文被识别为表单数据,它将在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
    )
Run Code Online (Sandbox Code Playgroud)

request.args包含从查询字符串解析的 args,而不管正文中的内容,因此get_request_data()如果它和正文都应该同时提供数据,您将删除它。


小智 8

使用request.get_json()得到张贴JSON数据。

data = request.get_json()
name = data.get('name', '')
Run Code Online (Sandbox Code Playgroud)

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

name = request.form.get('name', '')
Run Code Online (Sandbox Code Playgroud)

使用request.args得到的网址,用GET方法提交表单的时候喜欢的查询字符串传递的数据。

request.args.get("name", "")
Run Code Online (Sandbox Code Playgroud)

request.form等类似dict,get如果未通过默认值,请使用方法获取值。


Pho*_*ebe 8

在编写一个应该发送 JSON 数据的 Slack 机器人时,我Content-Typeapplication/x-www-form-urlencoded.

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

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

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

from flask import json

@ app.route('/slack/request_handler', methods=['POST'])
def request_handler():
   req_data = json.loads(request.form["payload"])
Run Code Online (Sandbox Code Playgroud)


Zav*_*vec 7

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

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


Div*_*ngh 6

@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"
Run Code Online (Sandbox Code Playgroud)


fre*_*zed 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>
"""
Run Code Online (Sandbox Code Playgroud)
@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>
"""
Run Code Online (Sandbox Code Playgroud)

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