Flask启用Gzip需安装flask-compress并调用Compress().init_app(app);Django启用需在MIDDLEWARE中添加GZipMiddleware;二者均需注意压缩阈值、MIME类型、客户端兼容性及代理层干扰。

Flask 里启用 Gzip 压缩要装什么、改哪几行
Flask 默认不压缩响应,得靠 flask-compress 这个扩展。别自己写中间件——容易漏掉状态码判断或缓存头处理,也难控制压缩级别和 MIME 类型白名单。
实操建议:
- 安装:
pip install flask-compress - 初始化(通常在创建
app实例后):from flask_compress import Compress<br>compress = Compress()<br>compress.init_app(app)
- 默认只压缩
text/html、text/css、application/json等常见类型;若需支持application/javascript或自定义类型,设COMPRESS_MIMETYPES配置项 - 压缩级别默认是 6,想更快可降为 1(
COMPRESS_LEVEL = 1),但体积会略大;别设 0——那等于没开
Django 中 Gzip 压缩开关在哪、哪些响应会被压
Django 自带 GZipMiddleware,但默认不启用,且只对满足条件的响应生效:必须是 200 状态码、响应体大于 200 字节、Content-Type 在白名单内(如 text/plain、application/json)、且客户端声明支持 gzip(即请求头含 Accept-Encoding: gzip)。
实操建议:
- 在
MIDDLEWARE列表中加入:'django.middleware.gzip.GZipMiddleware',位置建议靠前(比如在SecurityMiddleware后、CommonMiddleware前) - 确认
settings.py中没禁用:GZIP_CONTENT_TYPES控制 MIME 类型,GZIP_COMPRESSION_LEVEL控制压缩强度(1–9,默认 6) - 注意:静态文件(
static)走whitenoise或 Nginx 时,Django 中间件不生效;得另配 - 调试时可用
curl -H "Accept-Encoding: gzip" -I http://localhost:8000/api/看响应头是否含Content-Encoding: gzip
为什么加了压缩还是没看到 Content-Encoding: gzip
常见错误不是配置漏了,而是被更上游的组件截断或覆盖了响应头。比如本地开发用 ngrok 或某些代理工具,可能自动解压再转发;或者用了 gunicorn 并启用了 --preload,导致中间件加载顺序异常;又或者 Nginx 已经在反向代理层做了压缩,而 Flask/Django 的压缩被绕过了。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
排查要点:
- 先关掉所有代理/Nginx,直接 curl 本地服务,确认基础路径能出
Content-Encoding - 检查响应头里的
Vary: Accept-Encoding是否存在——没有的话,CDN 或浏览器可能缓存了未压缩版本 - 用
curl -v看完整请求/响应流,确认Accept-Encoding: gzip请求头确实发过去了 - 如果用了
gunicorn,别同时开--enable-stdio-inheritance和应用层压缩,容易冲突
压缩 JSON API 时要注意的边界情况
API 响应体小(比如 {"ok": true})时,Gzip 可能反而让传输体积变大,因为压缩头开销约 20–30 字节。另外,有些前端 SDK(如旧版 Axios)在解压失败时不报错,只返回空数据,排查起来像接口“没响应”。
实操建议:
- 设置最小压缩阈值:Flask-Compress 用
COMPRESS_MIN_SIZE = 500(单位字节),Django 用GZIP_MIDDLEWARE_MIN_SIZE = 500 - 避免压缩已加密或已编码的内容:比如 base64 图片字段、JWT token 字符串——它们本身熵高,Gzip 几乎无效,还白耗 CPU
- 测试时别只看
Content-Length,用curl -w "%{size_download}\n" -s -o /dev/null ...获取实际下载字节数 - 若 API 被移动端大量调用,注意 Android 4.x 某些 WebView 对
gzip + chunked组合解析不稳定,可考虑关闭分块传输(Response.direct_passthrough = False)
压缩不是开个开关就完事,真正麻烦的是它和缓存、代理、客户端兼容性缠在一起。最容易被忽略的是:你测的时候有 gzip,上线后 CDN 或 LB 把它悄悄解了又没重加头,结果前端以为没压缩,其实早被压过了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










