Jor*_*son 3 python flask python-requests
使用请求,我需要在一次发布中将带有json数据的numpy数组发送到我的flask应用程序。我该怎么做呢?
接受的答案对于小型阵列来说可以完成工作,但对于大型阵列来说性能却低得令人难以置信(至少有 150% 的开销)。
我建议使用 tostring() 而不是 tolist()。
编辑 2023: .tostring() 已替换为 .tobytes() - 两者都返回原始数据的副本(比发送数组的文本表示更有效)。
所以客户端会变成:
params = {'param0': 'param0', 'param1': 'param1'}
arr = np.random.rand(10, 10)
data = {'params': params, 'arr': arr.tostring()}
response = requests.post(url, json=data)
Run Code Online (Sandbox Code Playgroud)
和API:
@app.route('/test', methods=['POST'])
def test():
data = request.json
params = data['params']
arr = np.fromstring(data['arr'],dtype=float).reshape(10,10)
print(params, arr.shape)
return "Success"
Run Code Online (Sandbox Code Playgroud)
您应该注意,数组的形状和数据类型必须事先已知或在请求正文中告知。
要将numpy数组转换arr为json,可以在使用保留维度的同时对其进行序列化json.dumps(arr.tolist())。然后在api端,可以使用解析np.array(json.loads(arr))。
但是,使用requests json参数时,将为您处理转储和加载。arr.tolist()客户端和np.array(arr)api 所需的全部内容也是如此。下面是完整的示例代码。
客户:
params = {'param0': 'param0', 'param1': 'param1'}
arr = np.random.rand(10, 10)
data = {'params': params, 'arr': arr.tolist()}
response = requests.post(url, json=data)
Run Code Online (Sandbox Code Playgroud)
API:
@app.route('/test', methods=['POST'])
def test():
data = request.json
params = data['params']
arr = np.array(data['arr'])
print(params, arr.shape)
return "Success"
Run Code Online (Sandbox Code Playgroud)
输出:
{'param0': 'param0', 'param1': 'param1'} (10, 10)
Run Code Online (Sandbox Code Playgroud)
注意:在中使用files或data参数时requests.post,将json禁用该参数。