我想能够获得数据发送到我的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头,这是关于获取原始数据而不是解析数据。


当前回答

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

其他回答

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

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

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

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

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

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

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

下面是一个发送表单数据以向数据库添加用户的示例。检查请求。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>

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