我想能够获得数据发送到我的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:

其他回答

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

文档描述了请求期间请求对象(来自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只返回第一个值。

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

您可以从

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

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

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