如何在Django中使用Requests库单请求同时发送文件与JSON数据
解决Django API同时接收JSON和文件时的RawPostDataException错误
错误原因
当使用requests同时通过data和files参数发送请求时,请求会被自动封装为multipart/form-data格式。Django在解析request.FILES时已经读取并消耗了请求体的数据流,此时再访问request.body就会触发RawPostDataException异常——因为请求体数据流只能被读取一次。
解决方案
客户端代码修改
将JSON数据转为字符串,作为表单字段随文件一起发送:
import requests import json my_json = { # 你的JSON数据 "key1": "value1", "key2": 234 } # 将JSON转为字符串,作为表单的一个字段 form_data = {"json_data": json.dumps(my_json)} file = {"file": open("sample.txt", "rb")} response = requests.post( "http://127.0.0.1:8000/API/upload-file", data=form_data, files=file ) print(response.text)
Django服务端代码修改
不再直接读取request.body,而是从request.POST中获取JSON字符串并解析:
import json from django.http import HttpResponse def get_file(request): if request.method == "POST": uploaded_file = request.FILES["file"] # 从POST表单中取出JSON字符串并解析 json_data = json.loads(request.POST.get("json_data")) print(json_data) print(uploaded_file.filename) return HttpResponse("处理完成")
补充说明
如果你的JSON数据结构复杂,也可以将JSON作为一个单独的"文件"字段发送,但上述方式更符合常规的表单提交逻辑,也更易维护。
内容的提问来源于stack exchange,提问作者ivenoidea
相关产品推荐
相关产品推荐

