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

Django技术求助:无法以二进制形式读取urlopen响应文件(Python3.9.1/Django3.1.7)

解决Python 3.9 + Django 3.1.7中读取二进制响应的UnicodeDecodeError问题

这个问题的核心是Python 3和Python 2的IO模型差异,再加上Django对响应流的包装方式共同导致的:

  • 在Python 3中,_io.TextIOWrapper是专门处理文本流的工具,它会自动尝试把字节解码为UTF-8格式的字符串。但你要读取的是二进制内容(比如图片、非UTF-8编码的文件),这种自动解码逻辑就会触发UnicodeDecodeError。
  • Python 2的字符串模型没有严格区分字节和Unicode,所以之前的代码能正常运行,但到了Python 3就会出现兼容性问题。

具体解决方案

你需要绕过文本包装器,直接读取底层的二进制流。这里有个简单直接的实现方式:

import base64

# 从TextIOWrapper中分离出原始的二进制流
binary_stream = response.file.detach()
# 读取二进制数据
binary_data = binary_stream.read()
# 执行base64编码
encoded_result = base64.b64encode(binary_data)

为什么这个方法有效?

  • response.file.detach()会返回底层的二进制文件对象(脱离文本包装器的控制),这样你读取的就是原始的字节数据,不会触发自动解码操作。
  • base64.b64encode()需要接收字节类型的输入,直接传入二进制数据就能正常工作,不需要额外的格式转换。

如果你的场景允许,也可以在发起请求的时候就指定以二进制模式处理响应,但考虑到你已经拿到了Django的File对象,上面的方法是最直接的修复方式。

内容的提问来源于stack exchange,提问作者6apa6awka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:42:26