使用Python requests向Django/DRF上传文件报No file was submitted错如何解决
问题原因及修复方案
1. 文件字段名不匹配
你当前上传文件的字典key为aapl,但接口报错明确要求接收名为ohlc的文件字段,首先需要修改文件字典的键:
test_file = { "ohlc": open("./ohlc_aapl.json", "rb") # 将键从aapl改为接口要求的ohlc }
2. requests同时传files和json参数存在冲突
requests库中,json参数会自动设置请求头Content-Type: application/json,而files参数要求请求头为multipart/form-data,二者同时传入会出现请求格式冲突,导致后端无法正确解析参数。根据你的使用场景可选三种修复方案:
方案A:仅上传本地JSON文件,无需额外传payload
如果你只需要上传ohlc_aapl.json文件,不需要额外提交payload里的数据集,直接去掉json=payload参数即可:
r = requests.post(test_url, files=test_file)
方案B:需要同时传文件+payload数据集
如果要同时传递文件和结构化数据,需要把payload序列化为字符串,放到data参数中传递,同时在后端对应字段配置JSONField接收序列化后的JSON字符串即可:
import json r = requests.post( test_url, files=test_file, data={"payload": json.dumps(payload)} )
方案C:不需要传文件,直接提交JSON数据集
如果你实际不需要上传本地JSON文件,只是要提交payload里的结构化数据,直接删除files参数即可:
r = requests.post(test_url, json=payload)
额外注意
- 文件打开后记得在请求完成后调用
close()方法关闭,避免资源泄漏,更推荐使用with上下文管理器打开文件 - 可打印
r.request.headers和r.request.body排查请求参数是否符合预期
内容的提问来源于stack exchange,提问作者Aran Freel
相关产品推荐
相关产品推荐

