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

Pyt*_*ast 5 python curl flask python-requests postman

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

dav*_*ism 8

您已使用Postman将数据作为JSON发送,并且您已使用请求和curl将其作为表单数据发送.你可以告诉任何一个程序以你期望的方式发送数据,而不是让它使用它的"默认".例如,您可以发送带有请求的JSON:

import requests
requests.post('http://example.com/', json={'hello': 'world'})
Run Code Online (Sandbox Code Playgroud)

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

from flask import request
data = request.get_json()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)