You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:36:04