Flask中间件本质是WSGI中间件,需直接包装app.wsgi_app;before_request无法捕获静态文件、错误响应及早期异常;安全读取request body须在WSGI层缓冲并重置流;记录响应状态码和耗时必须拦截start_response;日志应过滤静态路径、探针请求并异步写入。

Flask 中间件本质是 WSGI 中间件,不是 Django 那种 middleware 类
Flask 本身不提供类似 Django 的 MIDDLEWARE 配置机制,所谓“中间件”实际是包装 app.wsgi_app 的 WSGI callable。直接修改 app.wsgi_app 是唯一可靠方式,任何试图用装饰器或 @app.before_request 实现“全局请求拦截”的做法,都会漏掉静态文件、错误响应(如 404)、以及未进入路由分发的早期异常。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 在创建
Flask实例后、调用run()前,用自定义函数包装app.wsgi_app - 不要在
before_request里记录请求体(request.get_data()会消耗流,后续视图无法读取) - 日志应包含
request.environ['REMOTE_ADDR']、request.method、request.path、response.status_code(需捕获响应对象)
如何安全读取 request body 并避免破坏后续处理
Flask 的 request.stream 是一次性流,直接调用 request.get_data() 会导致后续视图中 request.json 或 request.form 为空。必须在 WSGI 层做缓冲并重置流。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 在 WSGI 中间件里用
io.BytesIO缓存原始 body,并将新 stream 赋给environ['wsgi.input'] - 只对
POST/PUT/PATCH且Content-Type包含json或form的请求尝试读取 body - 设置最大读取长度(如
1024*1024),防止大文件上传阻塞 - 记录时用
json.dumps(body_dict, ensure_ascii=False),避免编码异常
记录响应状态码和耗时必须包装 response 对象
before_request 和 after_request 都无法获取真实响应状态码(after_request 接收的 response 可能已被修改,且不包含 404/500 等非视图返回的响应)。只有在 WSGI 层拦截 start_response 才能拿到最终 status。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 重写
start_response函数,在其中提取status并保存到environ中 - 用
time.perf_counter()记录请求开始与start_response调用之间的时间差 - 确保日志写入使用异步方式(如
queue.Queue+ 单独线程),避免阻塞主线程 - 不要在中间件里调用
logging.info()直接输出——高并发下 I/O 会成为瓶颈
生产环境必须绕过静态文件和健康检查路径
默认所有请求都走日志中间件,但 /static/、/healthz、/metrics 这类高频路径若也记录,日志量会爆炸,磁盘 IO 和解析成本陡增。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 在中间件开头判断
environ['PATH_INFO'].startswith('/static/')或匹配预设白名单 - 用
environ.get('HTTP_USER_AGENT', '')过滤掉监控探针(如Prometheus、curl健康检查) - 对
OPTIONS请求直接跳过(CORS 预检无业务意义) - 日志级别按路径分级:API 路径用
INFO,静态资源用DEBUG(可关闭)
真正难的不是写中间件,而是决定哪些字段必须记、哪些可以舍、哪些要脱敏(比如 token、手机号),还有怎么扛住每秒上千请求的日志写入压力——这些没在代码里,但在上线前得想清楚。

















