Django新建帖子上传GIF失败 缓存图片返回304状态码问题
1. 先修复代码里的显性bug
对比你两个视图的表单初始化逻辑就能发现问题:post_edit视图初始化表单时正确传入了files=request.FILES or None参数(Django处理带文件上传表单的必填参数),但post_create视图里的表单完全没接收上传文件流:
# post_create里的错误写法 form = PostForm(request.POST or None)
这就是问题的核心诱因。
你可能疑惑为什么jpg、png上传不受影响:大概率你用了富文本编辑器(CKEditor/TinyMCE这类),静态图的插入走的是编辑器自带的异步上传接口,不依赖当前表单的FILES对象,上传后直接把图片URL插入正文内容(正文是普通TextField存HTML文本,和表单文件流无关);但GIF动图因为涉及格式校验、缩略图生成逻辑,新建场景下表单拿不到FILES对象,就无法把动图正确关联到新创建的帖子实例上,编辑场景因为传了FILES所以功能正常。
直接把这行改成和编辑视图一致的写法即可:form = PostForm(request.POST or None, files=request.FILES or None)
改完先测试新建帖子传GIF,80%的概率这步就能解决问题。
2. 排查缩略图缓存配置问题
你日志里所有/media/cache/路径下的资源全是.jpg后缀,说明你用的缩略图生成库(easy-thumbnails/sorl-thumbnail这类)默认把上传的图片统一转成了JPG格式,新建帖子时因为GIF本身没被正确保存,页面渲染时直接命中了服务器上之前留存的旧JPG缓存,所以返回304状态码——这不是新资源的缓存响应,是直接拿了已经存在的旧文件,和你说的「新帖子不该命中缓存」的疑惑完全对应。
这部分排查点:
- 先清空
media/cache目录下所有缓存文件,避免旧缓存干扰测试结果 - 检查缩略图配置,添加动图保留原格式的规则,不要强制把GIF转成静态JPG,比如easy-thumbnails需要开启
preserve_extensions配置放行.gif后缀 - 确认服务器上的Pillow库安装时带了GIF处理依赖,避免生成GIF缩略图时静默失败 fallback 成JPG。
3. 校验表单与模型的规则配置
检查PostForm和Post模型的字段配置:
- 检查图片/文件字段的类型白名单,确认
.gif后缀、image/gifMIME类型在新建场景下也被放行,不要只在编辑场景(有已存在post实例时)才加入白名单 - 如果用了第三方富文本字段,检查字段的文件上传白名单配置,很多富文本默认只放行jpg/png格式,新建场景下没有关联帖子实例时会直接拦截GIF上传。
4. 日志验证方法
你现在贴的日志里,新建帖子提交后根本没有对应GIF文件的请求记录,只有两个旧的JPG缓存请求,说明GIF根本没被成功保存到media目录:
- 改完表单参数后重新测试,正常情况下提交后日志里应该出现对应GIF文件的GET请求,状态码为200而非304
- 如果还是异常,打开Django DEBUG模式看表单提交时的具体报错,大概率是文件校验不通过、或者GIF缩略图生成失败。
内容的提问来源于stack exchange,提问作者PythonBlonde

