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

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头,这是关于获取原始数据而不是解析数据。


要获得原始数据,请使用request.data。这只在它不能被解析为表单数据的情况下才有效,否则它将是空的和请求的。表单将有解析过的数据。

from flask import request
request.data

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

请求。data包含传入的请求数据作为字符串,以防它与mimetype Flask不处理。

request.args: the key/value pairs in the URL query string request.form: the key/value pairs in the body, from a HTML post form, or JavaScript request that isn't JSON encoded request.files: the files in the body, which Flask keeps separate from form. HTML forms must use enctype=multipart/form-data or files will not be uploaded. request.values: combined args and form, preferring args if keys overlap request.json: parsed JSON data. The request must have the application/json content type, or use request.get_json(force=True) to ignore the content type.

所有这些都是MultiDict实例(json除外)。您可以使用以下方法访问值:

请求。Form ['name']:如果知道键存在,则使用索引 Request.form.get ('name'):如果键可能不存在,则使用get Request.form.getlist ('name'):如果键被发送多次,并且你想要一个值列表,请使用getlist。Get只返回第一个值。


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

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

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

无论内容类型如何,使用request.get_data()获取原始的文章正文。如果你使用request。data,它调用request.get_data(parse_form_data=True),它将填充请求。form MultiDict并保留数据为空。


原始数据作为request.stream从WSGI服务器传递到Flask应用程序。流的长度在Content-Length报头中。

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

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


下面是一个解析发布的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:


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

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

要获得没有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)

在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()

得到请求。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"
}

在使用HTML表单发布表单数据时,请确保输入标记具有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输入有名称,所以它是request.form中唯一的键。


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

要获取原始数据,而不考虑内容类型,请调用request.get_data()。请求。data调用get_data(parse_form_data=True),而如果直接调用默认值为False。


如果主体被识别为表单数据,则它将在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
    )

请求。Args包含从查询字符串中解析出来的参数,而不管主体中有什么,所以如果它和主体同时需要数据,那么您将从get_request_data()中删除它。


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

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

使用请求。当使用POST方法提交表单时,表单可以获取数据。

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

使用请求。args获取URL查询字符串中传递的数据,就像使用get方法提交表单时一样。

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

请求。Form等是dict-like的,如果没有传递,使用get方法来获得一个默认值。


下面是一个发送表单数据以向数据库添加用户的示例。检查请求。method == "POST"检查表单是否已提交。根据要求使用钥匙。表单来获取表单数据。否则,使用<form>呈现HTML模板。表单中的字段应该具有与request.form中的键相匹配的name属性。

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>

@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"

在编写一个Slack机器人时,它应该发送JSON数据,我得到了一个有效载荷,其中内容类型是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"])

request.data

这很好用,但请记住,它是作为字符串传入的,需要遍历。


进口的要求:

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

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

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

JSON数据(适用于内容类型application/ JSON)

data = request.get_json()

试试- >

from flask import request

@app.route('/', methods=['GET', 'POST'])
def parse_request():
    if request.method == 'POST':
       data = request.form.get('data')

您可以从

请求。表单数据,包括表单和文件数据, 请求。Json和请求。get_json用于JSON数据 请求。头对头 请求。参数来获取查询参数

它们都像字典,使用请求。Form ['name']如果你知道这个键存在,或者request.form.get('name')如果它是可选的。


我只是面对同样的需求。我必须保存信息以备不时之需。所以,我使用下面的公式:

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

Repr (request)将给出基本信息的字符串表示。你可以添加用户代理数据: request.headers.get(“用户代理”)

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