Python中Brotli和zstd压缩在响应中的开启条件是什么

来源:AI技术网作者:长沙SEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《Python中Brotli和zstd压缩在响应中的开启条件是什么》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Python中Brotli和zstd压缩在响应中的开启条件是什么》有用,将其分享出去将是对创作者最好的鼓励。

在Python开发的Web服务场景中,Brotli和zstd是两种高效的响应压缩算法,相比传统的gzip能带来更好的压缩比和传输性能,但要正确开启这两种压缩,需要满足一系列客户端和服务端的对应条件。

Python中Brotli和zstd压缩在响应中的开启条件是什么

Brotli压缩的开启条件

客户端侧条件

客户端发起请求时,必须在Accept-Encoding请求头中包含br标识,告知服务端自身支持Brotli压缩格式的响应。如果请求头中没有该标识,服务端即使配置了Brotli压缩也不会生效。

服务端侧条件

首先需要在Python环境中安装Brotli依赖,使用pip执行安装命令:

pip install brotli

其次,服务端需要根据客户端的Accept-Encoding头动态判断,仅当检测到包含br时才对响应内容进行Brotli压缩。同时需要注意,Brotli压缩对文本内容(如HTML、CSS、JS、JSON)效果较好,对已经压缩过的二进制内容(如图片、视频)不建议开启,避免浪费CPU资源。

以Flask框架为例,开启Brotli压缩的示例代码如下:

from flask import Flask, request, Response
import brotli

app = Flask(__name__)

@app.after_request
def add_brotli_encoding(response):
    # 检查客户端是否支持Brotli
    if 'br' not in request.headers.get('Accept-Encoding', ''):
        return response
    # 仅对文本类响应进行压缩
    if 'text' not in response.content_type and 'json' not in response.content_type:
        return response
    # 压缩响应内容
    data = response.get_data()
    compressed_data = brotli.compress(data)
    response.set_data(compressed_data)
    response.headers['Content-Encoding'] = 'br'
    response.headers['Vary'] = 'Accept-Encoding'
    return response

if __name__ == '__main__':
    app.run(debug=True)

zstd压缩的开启条件

客户端侧条件

客户端需要在Accept-Encoding请求头中包含zstd标识,部分新版本的浏览器和HTTP客户端已经默认支持该标识,旧版本客户端可能需要手动配置请求头。

服务端侧条件

首先安装zstd的Python依赖:

pip install zstandard

服务端同样需要先校验客户端的Accept-Encoding头,确认支持zstd后再执行压缩。zstd压缩支持设置不同的压缩级别,级别越高压缩比越好但CPU消耗越大,默认级别为3,可根据服务性能灵活调整。

以FastAPI框架为例,开启zstd压缩的示例代码如下:

from fastapi import FastAPI, Request, Response
import zstandard as zstd

app = FastAPI()
# 初始化zstd压缩器,默认压缩级别为3
compressor = zstd.ZstdCompressor()

@app.middleware("http")
async def add_zstd_encoding(request: Request, call_next):
    response: Response = await call_next(request)
    # 检查客户端是否支持zstd
    if 'zstd' not in request.headers.get('Accept-Encoding', ''):
        return response
    # 仅对文本内容压缩
    if 'text' not in response.headers.get('content-type', '') and 'json' not in response.headers.get('content-type', ''):
        return response
    # 读取响应内容并压缩
    body = b""
    async for chunk in response.body_iterator:
        body += chunk
    compressed_body = compressor.compress(body)
    response.body = compressed_body
    response.headers['Content-Encoding'] = 'zstd'
    response.headers['Vary'] = 'Accept-Encoding'
    response.headers['Content-Length'] = str(len(compressed_body))
    return response

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

通用注意事项

  • 两种压缩算法都需要在响应头中正确设置Content-Encoding字段,值为对应的brzstd,否则客户端无法正确解码响应内容。
  • 建议同时设置Vary: Accept-Encoding响应头,避免缓存服务缓存错误编码的响应内容,导致后续请求返回无法解码的结果。
  • 可以设置压缩阈值,比如响应内容长度小于1024字节时不开启压缩,因为小内容压缩后体积变化不大,反而增加CPU开销。
  • 如果同时支持多种压缩算法,服务端应优先选择客户端支持且压缩比更好的算法,通常优先级为zstd > Brotli > gzip。

当满足上述客户端和服务端的对应条件后,Python Web服务就可以正确开启Brotli或zstd响应压缩,有效提升接口的传输效率。

BrotlizstdPython响应压缩修改时间:2026-07-01 22:57:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。