获取Flask请求中收到的数据

我希望能够将数据发送到我的Flask应用程序。我尝试访问request.data,但它是一个空字符串。如何访问请求数据?

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

1584388 次浏览

要获取原始数据,请使用#0。这仅适用于无法解析为表单数据的情况,否则它将为空,request.form将拥有解析后的数据。

from flask import requestrequest.data

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

request.data包含传入请求数据作为字符串,以防它附带的mimetype Flask无法处理。

  • #0:URL查询字符串中的键/值对
  • #0:正文中的键/值对,来自超文本标记语言帖子表单,或非JSON编码的JavaScript请求
  • #0:正文中的文件,Flask将其与form分开。超文本标记语言表单必须使用enctype=multipart/form-data,否则文件将不会被上传。
  • #0:合并argsform,如果键重叠,则首选args
  • #0:解析的JSON数据。请求必须具有application/json的内容类型,或使用#2忽略内容类型。

所有这些都是#0实例(除了json)。您可以使用以下命令访问值:

  • request.form['name']:如果您知道密钥存在,请使用索引
  • request.form.get('name'):如果密钥可能不存在,则使用get
  • request.form.getlist('name'):如果密钥被多次发送并且您想要一个值列表,则使用getlistget仅返回第一个值。

对于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,请使用#1

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),这将填充request.formMultiDict并将data留空。

原始数据作为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.jsonreturn 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

要解析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()

要获取request.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"}

使用超文本标记语言发布表单数据时,请确保input标记具有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输入有name,所以它是request.form中唯一的键。

如果内容类型被识别为表单数据,request.data将解析为request.form并返回一个空字符串。

要获取原始数据,无论内容类型如何,请调用#0request.data调用get_data(parse_form_data=True),而如果您直接调用它,则默认值为False

如果主体被识别为表单数据,它将在request.form中。如果它是JSON,它将在request.get_json()中。否则原始数据将在request.data中。如果您不确定如何提交数据,您可以使用or链来获取第一个带有数据的链。

def get_request_data():return (request.argsor request.formor request.get_json(force=True, silent=True)or request.data)

request.args包含从查询字符串中解析的参数,无论主体中包含什么,因此如果它和主体同时应该数据,您将从get_request_data()中删除它。

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

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

使用POST方法提交表单时,使用request.form获取数据。

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

使用request.args获取在URL的查询字符串中传递的数据,就像使用GET方法提交表单一样。

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

request.form等是类似于字典的,如果没有传递,请使用get方法获取默认值。

以下是发布表单数据以将用户添加到数据库的示例。检查request.method == "POST"以检查表单是否已提交。使用request.form中的键来获取表单数据。否则使用<form>呈现超文本标记语言模板。表单中的字段应具有与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.Dataid = 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"

当编写一个应该发送JSON数据的Slack bot时,我得到了一个有效负载,其中Content-Typeapplication/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数据(用于内容类型应用程序名称

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

您可以从获取请求数据

  1. request.form表单数据,这包括表单和文件数据,
  2. request.jsonrequest.get_json用于JSON数据
  3. request.headers标题
  4. request.args获取查询参数

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

我只是面临同样的需要。我必须保存信息以防任何意外情况。所以,我使用以下公式:

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

repr(请求)将提供基本信息的字符串表示形式。您可以使用以下命令添加用户代理数据:request.headers.get('User-Agent')

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