在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
相关产品推荐
相关产品推荐

