Flask中make_response返回gzip内容时无法获取响应数据的问题
报错原因
你调用的.content、.text属性和.json()方法,都是Python requests 客户端库返回的Response对象的接口,不是Flask框架自身Response对象的内置属性/方法,直接调用自然会报不存在、不可调用的错误。
正确获取响应字节的方式
Flask构造的响应对象,响应体的原始字节数据存在response.data属性中,直接读取这个属性就能拿到你之前写入的gzip压缩字节,后续直接做解压即可。
完整验证代码参考:
import gzip import json from flask import make_response # 原有压缩、构造响应的逻辑 large_dict = {"test": "大体积字典测试数据"} content = gzip.compress(json.dumps(large_dict).encode('utf8'), 9) response = make_response(content) response.headers['Content-length'] = len(content) response.headers['Content-Encoding'] = 'gzip' # 读取响应中的压缩字节 compressed_data = response.data print("gzip压缩字节:", compressed_data) # 解压还原原始字典 raw_data = gzip.decompress(compressed_data) restored_dict = json.loads(raw_data.decode('utf-8')) print("解压还原后的数据:", restored_dict)
额外注意事项
- 不要混用服务端框架和HTTP客户端的响应对象API,二者面向的使用场景不同,接口设计没有通用性
- Flask原生Response对象的
json是属性不是可调用方法,且仅能直接解析未压缩的JSON格式响应体,你当前传入的是gzip压缩后的二进制数据,必须先解压再做JSON反序列化,无法直接通过json属性读取 - 如果是使用Flask内置测试客户端发起请求拿到的测试响应,同样可以通过
.data属性拿到原始响应字节,高版本Flask的测试响应也支持.get_json()方法解析未压缩的JSON响应,但服务端构造的待返回响应直接读.data是最通用的方案
内容的提问来源于stack exchange,提问作者JD Carr
相关产品推荐
相关产品推荐

