使用 Postman 与请求发布到 Flask 会填充不同的请求属性

Posting to Flask with Postman versus requests populates different request attributes

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

我希望 http://werkzeug.pocoo.org/docs/0.10/wrappers/#werkzeug.wrappers.Request 的这句话能解释它:

data A descriptor that calls get_data() and set_data(). This should not be used and will eventually get deprecated.

您已使用 Postman 将数据作为 JSON 发送,并且您已使用 requests 和 curl 将其作为表单数据发送。您可以告诉任一程序按照您的期望发送数据,而不是让它使用它的 "default"。例如,您可以发送 JSON 请求:

import requests
requests.post('http://example.com/', json={'hello': 'world'})

另请注意,您可以直接从 Flask 请求中获取 JSON,而无需自己加载:

from flask import request
data = request.get_json()

request.data 包含请求的正文,无论它是什么格式。常见的类型有 application/jsonapplication/x-www-form-urlencoded。如果内容类型为 form-urlencoded,则 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()