Python 通过邮递员和请求向Flask投递会填充不同的请求属性

Python 通过邮递员和请求向Flask投递会填充不同的请求属性,python,curl,flask,python-requests,postman,Python,Curl,Flask,Python Requests,Postman,我正在向我的Flask应用程序和Postman以及请求库发送POST请求。当我使用Postman时,我可以使用json.loads(request.data)获取数据。当我使用requests或curl时,我可以使用request.form获取数据。为什么用这两个工具发送相同的数据来填充不同的属性?我希望下面的引文能够解释这一点: 数据 调用get_data()和set_data()的描述符。这不应该被使用,并且最终会被弃用 您使用Postman将数据作为JSON发送,使用requests和cu

我正在向我的Flask应用程序和Postman以及请求库发送POST请求。当我使用Postman时,我可以使用
json.loads(request.data)
获取数据。当我使用requests或curl时,我可以使用
request.form
获取数据。为什么用这两个工具发送相同的数据来填充不同的属性?

我希望下面的引文能够解释这一点:

数据 调用get_data()和set_data()的描述符。这不应该被使用,并且最终会被弃用


您使用Postman将数据作为JSON发送,使用requests和curl将其作为表单数据发送。您可以告诉任何一个程序按照您期望的方式发送数据,而不是让它使用其“默认值”。例如,您可以通过请求发送JSON:

import requests
requests.post('http://example.com/', json={'hello': 'world'})
还请注意,您可以直接从Flask请求获取JSON,而无需自己加载:

from flask import request
data = request.get_json()

request.data
保存请求的主体,无论其格式如何。常见的类型有
application/json
application/x-www-form-urlencoded
。如果内容类型为
formurlencoded
,则
request.form
将填充解析的数据。如果它是
json
,则
request.get_json()
将改为访问它


如果您真的不确定是以表单还是JSON的形式获取数据,那么可以编写一个简短的函数来尝试使用其中一个,如果不起作用,则使用另一个

def form_or_json():
    data = request.get_json(silent=True)
    return data if data is not None else request.form

# in a view
data = form_or_json()

我的问题是,既然
request.form
不起作用,为什么在使用POSTMAN时需要使用
request.data
。?我需要保持一致性。我该怎么做?