如何使用requests库和Flask通过HTTP POST请求发送numpy数组与PyTorch Tensor
问题原因
你直接把numpy.ndarray和torch.Tensor类型传入requests的data参数时,requests会自动调用对象的__str__方法转成字符串传输,所以服务端从form表单里只能拿到字符串格式的数据,没法直接还原成数组。
更优实现方案
比base64编码更优的方案有两种,可根据你的场景选择:
方案1:二进制序列化传输(最高效,推荐内部服务使用)
这种方式没有额外的编码开销,体积更小,序列化反序列化速度最快,完全不需要base64转换。
客户端代码修改
import requests import io import numpy as np import torch # 序列化numpy数组 img_byteio = io.BytesIO() np.save(img_byteio, info["array_image"]) img_byteio.seek(0) # 序列化torch张量 feat_byteio = io.BytesIO() torch.save(info["visual_features"], feat_byteio) feat_byteio.seek(0) # 以二进制表单形式发送数据 response = requests.post( "你的服务端接口地址", files={ "array_image": img_byteio, "visual_features": feat_byteio } )
服务端代码修改
from flask import Flask, request import io import numpy as np import torch app = Flask(__name__) @app.route('/path', methods=['POST']) def function_name(): # 读取二进制数据后反序列化 array_image = np.load(io.BytesIO(request.files['array_image'].read())) visual_features = torch.load(io.BytesIO(request.files['visual_features'].read())) # 验证类型 print(type(array_image)) # 输出 <class 'numpy.ndarray'> print(type(visual_features)) # 输出 <class 'torch.Tensor'> # 后续业务逻辑 return "success"
注意:如果是对外暴露的公共接口,使用pickle体系的序列化(np.save、torch.save默认基于pickle实现)需要做好数据校验,避免反序列化攻击。
方案2:JSON兼容格式传输(适合跨语言、对外接口场景)
如果需要接口兼容其他语言调用,不想依赖Python专属的序列化规则,可以转成通用列表格式用JSON传输:
客户端代码修改
import requests # 把数组/张量转成可序列化的列表 transfer_info = { "array_image": info["array_image"].tolist(), "visual_features": info["visual_features"].tolist() } # 用json参数发送 response = requests.post("你的服务端接口地址", json=transfer_info)
服务端代码修改
from flask import Flask, request import numpy as np import torch app = Flask(__name__) @app.route('/path', methods=['POST']) def function_name(): req_data = request.get_json() # 把列表还原成数组/张量 array_image = np.array(req_data['array_image']) visual_features = torch.tensor(req_data['visual_features']) # 后续业务逻辑 return "success"
这种方案通用性强,缺点是大尺寸数组转列表会增加传输体积,性能弱于二进制序列化方案。
不推荐base64方案的原因
base64编码会把二进制数据转换成文本格式,体积会比原二进制大1/3左右,同时多了编解码的性能开销,除非你必须在纯文本传输协议里传二进制数据,否则完全没必要用这个方案。
内容的提问来源于stack exchange,提问作者Hassan Kanso
相关产品推荐
相关产品推荐

