You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django新建帖子上传GIF失败 缓存图片返回304状态码问题

Django博客新建帖子上传GIF失效排查方案

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/gif MIME类型在新建场景下也被放行,不要只在编辑场景(有已存在post实例时)才加入白名单
  • 如果用了第三方富文本字段,检查字段的文件上传白名单配置,很多富文本默认只放行jpg/png格式,新建场景下没有关联帖子实例时会直接拦截GIF上传。

4. 日志验证方法

你现在贴的日志里,新建帖子提交后根本没有对应GIF文件的请求记录,只有两个旧的JPG缓存请求,说明GIF根本没被成功保存到media目录:

  • 改完表单参数后重新测试,正常情况下提交后日志里应该出现对应GIF文件的GET请求,状态码为200而非304
  • 如果还是异常,打开Django DEBUG模式看表单提交时的具体报错,大概率是文件校验不通过、或者GIF缩略图生成失败。

内容的提问来源于stack exchange,提问作者PythonBlonde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:12:11