Django返回图片二进制数据为HttpResponse时requests请求报错排查
问题描述
我尝试通过Django的HttpResponse返回图片二进制数据,响应Python requests库发起的POST请求。服务器显示响应传输成功,但用requests获取postresponse.content时报错,仅能输出postresponse.raw。尝试用JsonResponse返回时,提示字节对象不可序列化。
相关代码如下:
Django视图函数
def view(request): print("--------------------------------------------") print("type of request:", request.method) if request.method == "POST": print( "line 55 EPD, content of POST:", request.body) print( "META", request.META) print( "FILES", request.FILES) print( "headers", request.headers) print( "all", request) print("Content_params",request.content_params) print("COOKIES", request.COOKIES) print("accepts", request.accepts("application/octet-stream")) print("session:", request.session) with open(r"C:\....\main\image.bin", mode='rb') as p: Image=p.read() print(type(Image)) return HttpResponse(Image, headers={'Content-Type': 'application/octet-stream'})
requests请求代码
def make_request(): import requests url = 'http://localhost:8000/view/' print("before sending the POST") print("sending") parameters = { 'Size':0, 'length':1, } postresponse = requests.post(url, json=parameters, stream=True, headers= {'Content-Type':'application/json; charset=utf-8'}, timeout=10) print(postresponse.status_code) print("Now print Response") print("headers:", postresponse.headers) print("encoding:", postresponse.encoding) print("raw:",postresponse.raw) print("content:", postresponse.content) make_request()
报错信息
C:...\requests\models.py", line 899, in content self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b""
解决建议
调整requests调用方式
如果不需要流式传输大文件,直接去掉stream=True参数,让requests自动处理响应内容:postresponse = requests.post(url, json=parameters, headers={'Content-Type':'application/json; charset=utf-8'}, timeout=10)若必须使用
stream=True,则手动迭代读取内容块:postresponse = requests.post(url, json=parameters, stream=True, headers={'Content-Type':'application/json; charset=utf-8'}, timeout=10) content = b'' # 逐块读取内容 for chunk in postresponse.iter_content(chunk_size=1024): if chunk: content += chunk print("content:", content)优化Django响应头
在Django视图中添加Content-Length头,明确告知响应内容的长度,帮助requests正确处理二进制数据:def view(request): if request.method == "POST": with open(r"C:\....\main\image.bin", mode='rb') as p: image_data = p.read() response = HttpResponse(image_data, content_type='application/octet-stream') # 设置内容长度 response['Content-Length'] = str(len(image_data)) return response排查Django中间件干扰
检查项目中的中间件,确保没有对application/octet-stream类型的响应进行额外的编码或修改操作,避免破坏二进制数据的完整性。
注:
JsonResponse仅支持JSON可序列化的数据,二进制字节对象无法直接序列化,因此使用HttpResponse返回二进制内容是正确的选择。
内容的提问来源于stack exchange,提问作者Prajwal Ramesh
相关产品推荐
相关产品推荐

