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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:45:25