我想能够获得数据发送到我的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.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()中删除它。

其他回答

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

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

要获取原始数据,而不考虑内容类型,请调用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.data。这只在它不能被解析为表单数据的情况下才有效,否则它将是空的和请求的。表单将有解析过的数据。

from flask import request
request.data

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