django应使用gzipmiddleware而非django-compressor实现响应压缩,因前者压缩http响应体,后者仅优化静态资源;生产环境需显式配置gzip_min_length=1024、gzip_content_types包含application/json,并确保中间件位于commonmiddleware之后、securitymiddleware之前。

flask-compress 或 GZipMiddleware,别手写压缩逻辑——90% 的错误来自手动控制 Content-Encoding、Vary 头或忽略响应体长度阈值。
Flask 里启用 gzip 压缩只需三步,但第二步最容易漏
安装扩展、初始化、检查 MIME 类型白名单——缺一不可。
- 安装:
pip install flask-compress - 初始化必须在
app实例创建后、路由注册前执行:Compress().init_app(app);放在if __name__ == "__main__"里就晚了 - 默认只压
text/html、application/json等类型;若接口返回application/vnd.api+json或自定义 MIME,得显式配置:app.config['COMPRESS_MIMETYPES'] = ['text/html', 'application/json', 'application/vnd.api+json']
Django 中间件压缩不生效?先看这四个条件是否同时满足
GZipMiddleware 是开关,不是魔法——它只对同时满足以下四点的响应生效:
- 状态码是
200(4xx/5xx 不压) - 响应体原始字节长度 > 200(小于等于 200 字节跳过,避免小数据越压越大)
-
Content-Type在GZIP_CONTENT_TYPES白名单内(默认不含application/javascript) - 请求头含
Accept-Encoding: gzip(浏览器或客户端没发这个头,中间件直接绕过)
调试时用 curl -I -H "Accept-Encoding: gzip" http://localhost:8000/api/ 看响应头有没有 Content-Encoding: gzip,没有就逐条核对上面四点。
requests 自动解压失效时,常见原因不是 gzip 没开,而是头被覆盖
你看到 response.content 是乱码,response.text 却正常?说明 requests 已经解压过了。真正的问题常出现在上游:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 本地用了
ngrok或 Charles 这类代理工具,它们可能自动解压再转发,导致你收不到Content-Encoding: gzip头 - Nginx 反向代理层已开启
gzip on,而 Flask/Django 的压缩被绕过——此时看 Nginx 日志比看 Python 日志更有效 - gunicorn 启动加了
--preload,导致中间件加载顺序异常,Content-Encoding被后续中间件覆盖
手动压缩响应体时,mtime=0 这个参数不能省
用 gzip.GzipFile 手动压缩时,如果不设 mtime=0,生成的 .gz 文件会带当前时间戳,导致每次压缩结果不同——这会让 CDN 或代理层无法正确缓存,也影响 ETag 计算。
正确写法:
import gzip
from io import BytesIO
buf = BytesIO()
with gzip.GzipFile(fileobj=buf, mode="wb", mtime=0) as f:
f.write(data.encode("utf-8"))
compressed = buf.getvalue()
注意:别用 gzip.compress() 直接压字符串,它内部默认用 mtime=time.time(),缓存友好性差。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










