fix(反馈): 优化图片处理与静态资源缓存 #211
Reference in New Issue
Block a user
Delete Branch "fix-bugfix0731"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🤖 review-pr 深审结论
🟢 看着没问题(置信度 0.85)——反馈图缩略图方案实现得比较稳:路径穿越三处设防、原子写、失败优雅回退、向后兼容、缓存作用域正确。已在合并 main 后的隔离 worktree 实跑验证,无阻断性问题,仅几条低优先建议。
✅ 实跑验证(合并结果树上,已装 PR 声明的新依赖 Pillow 12.3)
pytest tests/test_feedback.py→ 4 passedruff check改动 4 文件 → All checks passed🟡 低优先建议(非阻断)
save_feedback_image现在在async def submit_feedback里同步做 PIL 解码+LANCZOS 缩放+JPEG 编码(最多 6 张顺序处理),会阻塞事件循环;单 worker 下会拖慢并发请求。反馈是低频路径影响有限,但可考虑run_in_threadpool卸载,或改 fire-and-forget(失败本就已容忍)。MAX_IMAGE_PIXELS2× 以内(~178M px)的图可绕过炸弹保护、瞬时吃较多内存;已有 5MB 字节上限 + 鉴权兜底,可考虑显式收紧MAX_IMAGE_PIXELS或加尺寸上限。FeedbackMediaStaticFiles里对feedback_thumbs/的特判在正常运行下不可达——显式路由/media/feedback_thumbs/{filename}始终遮蔽静态挂载(缩略图恒由 FileResponse 提供并自带 immutable 头)。无害的 defense-in-depth。.jpg结尾并按 immutable 缓存 1 年;图片按内容嗅探能正常显示,且解码失败对同一文件是确定性的,可接受。main.py顶部已 importHTTPException,download_apk内仍有局部from fastapi import HTTPException(历史遗留),现在冗余可删。👍 亮点
/records不做图片解码,feedback_thumbnail_url是纯字符串映射——正解,避开了注释警示的 N 张图解码。_feedback_thumbnail_paths/feedback_thumbnail_file双重把关(Path(name).name != name+ 后缀白名单),实测../、a/b、反斜杠、空串、.jpg全部拒绝。os.replace)并发安全、跨平台;EXIF 方向已处理;宽高比保持。default_factory,旧记录首次查看时懒补缩略图,向后兼容。