获取 Flask 请求中收到的数据

2024-11-18 08:41:00
admin
原创
210
摘要:问题描述:我希望能够获取发送到 Flask 应用的数据。我尝试访问,request.data但结果为空字符串。如何访问请求数据?from flask import request @app.route('/', methods=['GET', 'POST']) def parse_request(): ...

问题描述:

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


解决方案 1:

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

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

  • request.args:URL 查询字符串中的键/值对

  • request.form:正文中的键/值对,来自 HTML 发布表单或非 JSON 编码的 JavaScript 请求

  • request.files:正文中的文件,Flask 将其与 分开保存form。HTML 表单必须使用enctype=multipart/form-data,否则文件将无法上传。

  • request.values: 组合args和,如果键重叠则form优先args

  • request.json:解析后的JSON数据,请求必须有application/json内容类型,否则使用request.get_json(force=True)忽略内容类型。

所有这些都是MultiDict实例(除了json)。您可以使用以下方式访问值:

  • request.form['name']:如果你知道键存在,则使用索引

  • request.form.get('name')get如果键可能不存在,则使用

  • request.form.getlist('name')getlist如果多次发送键并且您想要一个值列表,则使用。get仅返回第一个值。

解决方案 2:

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

对于以内容类型发布的 JSON application/json,使用request.get_json()

data = request.get_json()

解决方案 3:

要获取原始数据,请使用request.data。这仅在无法解析为表单数据时才有效,否则它将为空并且request.form将包含解析后的数据。

from flask import request
request.data

解决方案 4:

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

使用 postman 发布 JSON

解决方案 5:

要获取原始帖子正文(无论内容类型如何),请使用request.get_data()。如果您使用request.data,它会调用request.get_data(parse_form_data=True),这将填充request.form MultiDictdata留空。

解决方案 6:

如果您发布的内容类型为 JSON application/json,则使用request.get_json()在 Flask 中获取它。如果内容类型不正确,None则返回。如果数据不是 JSON,则会引发错误。

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

解决方案 7:

要获得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 发布表单数据的示例,以 JSON 格式返回:

$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
  "name": "ivanleoncz", 
  "role": "Software Developer"
}

解决方案 8:

您可以从以下位置获取请求数据

  1. request.form对于表单数据,包括表单和文件数据,

  2. request.json对于request.get_jsonJSON 数据

  3. request.headers用于标题

  4. request.args获取查询参数

它们都像一本字典,request.form['name']如果您知道键存在或者request.form.get('name')它是可选的,就可以使用。

解决方案 9:

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

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

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

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

用于request.args获取在 URL 的查询字符串中传递的数据,例如使用 GET 方法提交表单时。

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

request.form等类似于字典,get如果未传递则使用该方法获取具有默认值的值。

解决方案 10:

导入请求:

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

或(如果知道键存在则使用索引,指定输入字段的名称

name = request.form['name']
age = request.form['age']

JSON 数据(针对内容类型application/json

data = request.get_json()

解决方案 11:

要获取不带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)

解决方案 12:

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

解决方案 13:

原始数据以 的形式从 WSGI 服务器传入 Flask 应用程序request.stream。流的长度位于Content-Length标头中。

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

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

解决方案 14:

以下是发布表单数据以将用户添加到数据库的示例。检查request.method == "POST"表单是否已提交。使用 中的键request.form获取表单数据。否则,使用 呈现 HTML 模板<form>。表单中的字段应具有name与 中的键匹配的属性request.form

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>

解决方案 15:

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

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

解决方案 16:

如果主体被识别为表单数据,它将以 的形式存在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
    )

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

解决方案 17:

在编写一个应该发送 JSON 数据的 Slack 机器人时,我得到了一个有效载荷,其中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.formJSON 的表单数据字段,然后加载它。

from flask import json

@ app.route('/slack/request_handler', methods=['POST'])
def request_handler():
   req_data = json.loads(request.form["payload"])

解决方案 18:

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

要获取原始数据(无论内容类型如何),请调用.calls request.get_data(),而默认方法是直接调用它。request.data`get_data(parse_form_data=True)`False

解决方案 19:

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

解决方案 20:

当使用 HTML 表单发布表单数据时,请确保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

解决方案 21:

要获取表单数据,请尝试一下,请求对象允许我们访问来自请求的数据。它还可以帮助我们访问有关请求的其他信息。希望有所帮助。:)

from flask import Flask, request


app = Flask(__name__)

@app.get('/')
def index():
  json_data = request.get_json() #this will get the json data and return a dictionary containing the data sent
  
  form_data = request.form #this will get the form data return a dictionary of the data submitted in a form


  #such can be accessed in the following way
   username = json_data.get('username')
   email = form_data.get('email') # this will be value from the email input
  ....

解决方案 22:

尝试一下

 json_data = request.form or request.get_json()
 data = dict(json_data)

它将把表单和 JSON 数据放在一起并将其转换为字典

解决方案 23:

我浏览了上面的所有答案,但是,我注意到没有人真正谈论过当您从客户端(当您的客户端来自不同的来源,例如 React 应用程序)接收到服务器端的数据时,您还需要在OPTIONSFlask 中处理飞行前请求以允许跨源访问,否则会引发 CORS 错误。处理完之后,通常的过程是使用对象get_json()上的方法request。以下是对我有用的代码:

@app.route("/read_row_to_customer_sheet", methods=["POST", "OPTIONS"])
def read_row_to_customer_sheet():
    if request.method == "OPTIONS":
        response = make_response()
        response.headers.add("Access-Control-Allow-Origin", "*")
        response.headers.add('Access-Control-Allow-Headers', "*")
        response.headers.add("Content-Type", "application/json")
        return response
    elif request.method == 'POST':
        form = request.get_json()
        print(form)
        # your custom logic goes here
        response = make_response()
        response.headers.add("Access-Control-Allow-Origin", "*")
        return response 

另外,请确保将request.get_json()elif 块放在函数的开头而不是开头。否则,您将在客户端遇到 CORS 错误,并且可能在服务器端遇到 415 错误,因为当您收到飞行前 OPTIONS 请求时,函数将尝试将其解码为 json,因为您将 放在request.get_json()开头,因此,以下控制流是错误的:

### WRONG Route Function
@app.route("/read_row_to_customer_sheet", methods=["POST", "OPTIONS"])
def read_row_to_customer_sheet():
    form = request.get_json()
    if request.method == "OPTIONS":
        response = make_response()
        response.headers.add("Access-Control-Allow-Origin", "*")
        response.headers.add('Access-Control-Allow-Headers', "*")
        response.headers.add("Content-Type", "application/json")
        return response
    elif request.method == 'POST':
        print(form)
        # your custom logic goes here
        response = make_response()
        response.headers.add("Access-Control-Allow-Origin", "*")
        return response 

解决方案 24:

我也面临同样的需求。我必须保存信息以防万一。因此,我使用以下公式:

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

repr(request) 将给出基本信息的字符串表示。你可以使用以下命令添加用户代理数据:request.headers.get('User-Agent')

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

解决方案 25:

request.data

这个很好用,但请记住它是以字符串的形式出现并且需要进行迭代。

解决方案 26:

尝试 ->

from flask import request

@app.route('/', methods=['GET', 'POST'])
def parse_request():
    if request.method == 'POST':
       data = request.form.get('data')
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2588  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1553  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   31  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   26  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   21  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用