brotli/zstd未生效主因是客户端未在accept-encoding声明支持,服务端配置无效;需用curl等工具测试,检查content-encoding响应头,并注意框架支持差异及nginx压缩冲突。

HTTP 响应里 Brotli / zstd 没生效?先看客户端是否发了 Accept-Encoding
服务端再怎么配,如果客户端没在请求头里声明支持,就不会触发压缩。浏览器、curl、某些旧版 HTTP 客户端默认不发 br 或 zstd,只带 gzip。
- 用
curl -H "Accept-Encoding: br" http://localhost:8000/测试 Brotli,别只靠浏览器访问 - Chrome 和 Firefox 支持
br,但不支持zstd(截至 2024 年主流版本);zstd目前基本只在 curl 8.0+、Postman 10.15+、或自定义客户端中可用 - 检查响应头是否有
Content-Encoding: br或zstd,而不是只看体积变小了——体积小可能是其他压缩或缓存导致的
Python Web 框架里启用 Brotli / zstd 的真实门槛
不是所有框架都原生支持 zstd;Brotli 虽然常见,但多数框架(如 Flask、FastAPI 默认中间件)只内置 gzip,需额外装包 + 手动注册编码器。
-
fastapi需配合starlette.middleware.base.BaseHTTPMiddleware+brotli或zstandard库自行实现压缩逻辑,官方GZipMiddleware不识别br/zstd -
django的GZipMiddleware完全不处理br或zstd,得用第三方包如django-compression-middleware,且要注意其对zstd的支持是实验性的 - 用
uvicorn单独跑 ASGI 应用时,它本身不压缩响应;压缩必须由应用层或反向代理(如 Nginx)完成
brotli 和 zstandard 包安装与基础用法差异
两个库 API 风格不同,误用会导致静默失败或 CPU 爆高。比如 brotli 的 compress() 默认用最高级别,而 zstandard 默认几乎不压缩。
微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于移动端,旨在提供便捷的用户体验,无需下载安装即可在微信内使用。本压缩包包含了丰富的源码资源,涵盖了多个领域的应用场景,下面将逐一介绍其中涉及的知识点。1. 图片展示:这部分源码可能涉及了微信小程序中的``组件的使用,用于显示图片,以及`wx.getSystemInfo`接口获取屏幕尺寸,实现图片的适配和响应式布局。可能还包括了图片懒加
- 装包:用
pip install brotli(注意不是brotlipy,后者已弃用);zstd对应的是pip install zstandard - Brotli 压缩建议显式设
quality=4(默认 11,太慢),例如:brotli.compress(data, quality=4) - Zstd 推荐用
zstandard.ZstdCompressor(level=3),level=1~3 平衡速度和压缩率;直接调zstandard.compress(data)会用默认 level=3,但部分旧版本默认 level=1,行为不一致 - 两者都不自动加响应头;你得手动设
response.headers["Content-Encoding"] = "br"或"zstd",否则客户端无法解码
反向代理(Nginx)和 Python 应用共存时的压缩冲突
如果 Nginx 开了 gzip on 或 gunzip on,又让 Python 应用也压缩,容易出现双重压缩、响应头错乱,甚至返回乱码。
立即学习“Python免费学习笔记(深入)”;
- Nginx 的
gzip_vary on会让它根据Accept-Encoding自动选 gzip / br / zstd —— 但前提是它自己编译时启用了对应模块(--with-http_brotli_module或第三方zstd补丁) - 更稳妥的做法:关掉 Nginx 压缩,把压缩逻辑收归 Python 层统一控制;或者彻底交给 Nginx,Python 应用不碰
Content-Encoding - 特别注意:Nginx 对
zstd的支持极弱,目前无稳定官方模块;强行用第三方 patch 容易在升级后失效









