我想能够获得数据发送到我的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.stream从WSGI服务器传递到Flask应用程序。流的长度在Content-Length报头中。

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

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

其他回答

在使用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.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()中删除它。

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

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

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

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

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

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