You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中获取浏览器端HTTP响应大小及对比gzip与非gzip差异

在Django中对比gzip压缩前后的响应数据大小

一、获取未启用gzip时的响应大小

方法1:视图内直接计算

在视图函数中生成响应内容后,直接计算原始内容的字节大小,可将其写入响应头方便查看:

from django.http import HttpResponse

def sample_view(request):
    # 模拟响应内容(实际场景可能是渲染模板、返回JSON等)
    content = "大量文本内容或结构化数据..."
    # 计算未压缩字节数
    uncompressed_size = len(content.encode('utf-8'))
    
    response = HttpResponse(content)
    # 自定义响应头存储原始大小
    response['X-Uncompressed-Size'] = str(uncompressed_size)
    return response

方法2:自定义中间件全局统计

编写中间件,在所有响应返回前自动计算并标记未压缩大小,适合全局统计:

class UncompressedSizeMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        # 仅针对有content属性的响应计算
        if hasattr(response, 'content'):
            response['X-Uncompressed-Size'] = str(len(response.content))
        return response

将该中间件添加到settings.py的MIDDLEWARE列表中。

二、启用gzip压缩并获取压缩后大小

1. 开启Django的gzip压缩

在settings.py中配置内置的GZipMiddleware,注意顺序需放在其他响应处理中间件之前:

MIDDLEWARE = [
    'django.middleware.gzip.GZipMiddleware',
    # 其他中间件(如CommonMiddleware、CsrfViewMiddleware等)
]

# 可选:指定需要压缩的内容类型
GZIP_CONTENT_TYPES = [
    'text/html',
    'text/css',
    'application/javascript',
    'application/json',
]

2. 获取压缩后的响应大小

方式1:中间件统计压缩后大小

调整中间件顺序,让自定义中间件在GZipMiddleware之后执行,即可拿到压缩后的内容大小:

class CompressedSizeMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        if hasattr(response, 'content'):
            compressed_size = len(response.content)
            response['X-Compressed-Size'] = str(compressed_size)
            # 计算压缩比(如果已标记未压缩大小)
            if 'X-Uncompressed-Size' in response.headers:
                uncompressed = int(response['X-Uncompressed-Size'])
                ratio = (1 - compressed_size / uncompressed) * 100
                response['X-Compression-Ratio'] = f"{ratio:.2f}%"
        return response

将该中间件放在GZipMiddleware之后,浏览器请求时就能在响应头中看到压缩后大小和压缩比。

方式2:浏览器开发者工具查看

打开浏览器开发者工具(F12)→ 切换到Network标签,发起请求后查看:

  • Content-Length:压缩后的响应数据大小
  • 自定义的X-Uncompressed-Size:未压缩的原始大小

三、自动化批量对比

用requests库模拟请求,批量测试压缩前后的大小差异:

import requests

target_url = "http://localhost:8000/sample-view/"

# 请求未压缩内容(禁用自动解压)
resp_uncompressed = requests.get(target_url, headers={'Accept-Encoding': 'identity'})
uncompressed_size = len(resp_uncompressed.content)

# 请求gzip压缩内容(禁止自动解压,获取原始压缩字节)
resp_compressed = requests.get(target_url, headers={'Accept-Encoding': 'gzip'}, stream=True)
resp_compressed.raw.decode_content = False
compressed_size = len(resp_compressed.raw.read())

print(f"未压缩大小: {uncompressed_size} bytes")
print(f"压缩后大小: {compressed_size} bytes")
print(f"压缩比: {(1 - compressed_size/uncompressed_size)*100:.2f}%")

内容的提问来源于stack exchange,提问作者seyed abas alavi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:30:55