当前位置: 首页 > news >正文

python后端 启用 gzip 压缩响应体

1. Flask

服务器端代码 (使用 Flask)

from flask import Flask, jsonify, request
from flask_compress import Compress
import loggingapp = Flask(__name__)
Compress(app)  # 启用 gzip 压缩# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)@app.route('/data', methods=['GET'])
def get_data():try:# 处理请求参数count = int(request.args.get('count', 100))# 返回一些示例 JSON 数据data = {'message': 'Hello, this is compressed data!','numbers': list(range(count))}return jsonify(data)except Exception as e:logger.error(f"Error occurred: {e}")return jsonify({'error': 'Internal Server Error'}), 500@app.errorhandler(404)
def page_not_found(e):return jsonify({'error': 'Not Found'}), 404if __name__ == '__main__':app.run(debug=True)

客户端代码 (接收并解压 gzip 响应)

import requests
import gzip
import json
from io import BytesIOdef fetch_data(url):try:# 发送请求到服务器端response = requests.get(url)# 检查响应头,确认数据是否被 gzip 压缩if response.headers.get('Content-Encoding') == 'gzip':# 使用 gzip 解压响应内容compressed_content = BytesIO(response.content)with gzip.GzipFile(fileobj=compressed_content, mode='rb') as f:decompressed_data = f.read()# 解码解压后的数据data = json.loads(decompressed_data.decode('utf-8'))return dataelse:return response.json()except requests.RequestException as e:print(f"HTTP request failed: {e}")return Noneexcept json.JSONDecodeError as e:print(f"Failed to decode JSON: {e}")return Noneexcept Exception as e:print(f"An error occurred: {e}")return Noneif __name__ == '__main__':url = 'http://127.0.0.1:5000/data?count=50'data = fetch_data(url)if data:print(data)else:print("Failed to fetch data.")

2. FastAPI

服务器端代码 (使用 FastAPI)

pip install fastapi uvicorn fastapi-compress
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import JSONResponse
from fastapi_compress import Compress
import loggingapp = FastAPI()
compressor = Compress()
compressor.init_app(app)# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)@app.get("/data")
async def get_data(count: int = 100):try:# 返回一些示例 JSON 数据data = {'message': 'Hello, this is compressed data!','numbers': list(range(count))}return JSONResponse(content=data)except Exception as e:logger.error(f"Error occurred: {e}")raise HTTPException(status_code=500, detail="Internal Server Error")@app.exception_handler(404)
async def not_found_handler(request: Request, exc: HTTPException):return JSONResponse(status_code=404, content={'error': 'Not Found'})if __name__ == '__main__':import uvicornuvicorn.run(app, host="127.0.0.1", port=8000, log_level="info")

客户端代码 (接收并解压 gzip 响应)

import requests
import gzip
import json
from io import BytesIOdef fetch_data(url):try:# 发送请求到服务器端response = requests.get(url)# 检查响应头,确认数据是否被 gzip 压缩if response.headers.get('Content-Encoding') == 'gzip':# 使用 gzip 解压响应内容compressed_content = BytesIO(response.content)with gzip.GzipFile(fileobj=compressed_content, mode='rb') as f:decompressed_data = f.read()# 解码解压后的数据data = json.loads(decompressed_data.decode('utf-8'))return dataelse:return response.json()except requests.RequestException as e:print(f"HTTP request failed: {e}")return Noneexcept json.JSONDecodeError as e:print(f"Failed to decode JSON: {e}")return Noneexcept Exception as e:print(f"An error occurred: {e}")return Noneif __name__ == '__main__':url = 'http://127.0.0.1:8000/data?count=50'data = fetch_data(url)if data:print(data)else:print("Failed to fetch data.")

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 虚拟DOM、Vue渲染流程
  • Python3 爬虫 数据抓包
  • 【深入剖析】Spring依赖注入的最佳实践(@Autowired的正确用法)
  • 【RabbitMQ】直连交换机_扇形交换机_主题交换机
  • Vision Pro 3D 目标跟踪实战案例:厨房场景应用
  • QTableView使用示例-Qt模型视图代理(Model-View-Delegate)使用示例
  • Go-反射
  • 2024最新最全面的Selenium 3.0 + Python自动化测试框架
  • LeetCode每日一题_572.另一棵树的子树
  • C#学习笔记14:SYN6288语音模块_Winform上位机控制软件
  • 使用Variadic Templates(可变参数模板)实现printf
  • electron 配置、打包 -报错解决
  • RocketMQ 的认证与授权机制
  • Hive自定义Serde,实现自定义多字符串作为分隔符
  • 【C++】对象模型和this指针
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 《剑指offer》分解让复杂问题更简单
  • 【技术性】Search知识
  • 2017前端实习生面试总结
  • avalon2.2的VM生成过程
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • crontab执行失败的多种原因
  • Fastjson的基本使用方法大全
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 回顾2016
  • 基于游标的分页接口实现
  • 那些年我们用过的显示性能指标
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 学习JavaScript数据结构与算法 — 树
  • 一个项目push到多个远程Git仓库
  • C# - 为值类型重定义相等性
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #控制台大学课堂点名问题_课堂随机点名
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (a /b)*c的值
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (不用互三)AI绘画工具应该如何选择
  • (第27天)Oracle 数据泵转换分区表
  • (二十三)Flask之高频面试点
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (小白学Java)Java简介和基本配置
  • (转)ObjectiveC 深浅拷贝学习
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 8.0 发布到 IIS