向Django/Tastypie服务端传输大体积zip文件的报错及方案咨询
问题根因分析
- 你调用
socket.connect()时传入的第一个参数是完整HTTP URLhttp://192.168.0.21:8000/api/v1/ziptest/,但socket连接只需要纯IP地址,不需要带http://前缀和接口路径,地址解析失败才会抛出Name or service not known错误。 - 就算修正了连接地址,原生TCP socket传输的是裸二进制流,没有符合HTTP协议的请求头、请求体格式,你的服务端是基于HTTP的REST接口,根本识别不了socket发送的内容,所以资源函数永远不会被触发。
方案选型建议
原生socket不是该场景的最优方案,你需要对接已有的HTTP服务,自己实现HTTP协议的工作量大、容错性差,有更简便的实现方式:
1. 对接现有HTTP接口的推荐方案:用requests库实现文件上传
直接用成熟的HTTP请求库处理协议层逻辑,几行代码就能实现,支持大文件流式上传,不会占用过多内存:
树莓派端示例代码:
import requests def send_file(): # zipTypes替换为你实际的文件名前缀列表 upload_url = "http://192.168.0.21:8000/api/v1/ziptest/" for zip_type in zipTypes: file_path = f'/logs/rel_5_0608.3800_val2/{zip_type}.zip' print(f"正在上传:{file_path}") # 流式上传大文件,不会一次性读入内存 with open(file_path, 'rb') as f: files = {'file': f} resp = requests.post(upload_url, files=files, timeout=3600) resp.raise_for_status() print(f"{file_path} 上传完成,响应状态:{resp.status_code}")
服务端需要在ResponseZipTest类中实现POST请求的文件接收逻辑,从request对象中读取上传的文件流保存即可。
2. 无需对接现有HTTP接口的极简方案
如果只是局域网内树莓派到Windows的大文件传输,不需要对接现有业务接口,可以直接用现成工具,不用写自定义代码:
- Windows端开启samba共享文件夹,树莓派挂载共享目录后直接复制文件即可
- Windows端打开SSH服务,树莓派用scp命令直接传输文件:
scp /本地路径/xxx.zip windows用户名@192.168.0.21:/目标路径/ - 用Python自带的HTTP服务实现临时传输:Windows端在目标文件夹下运行
python -m http.server 8000,树莓派用curl/post请求上传即可。
内容的提问来源于stack exchange,提问作者Toby
相关产品推荐
相关产品推荐

