Django项目media文件夹图片突然无法加载返回404错误
故障根因
核心问题是MEDIA_URL配置缺少前导斜杠,属于相对路径配置缺陷,之前数月能正常运行完全是路径解析的巧合:
- 当前配置
MEDIA_URL = 'media/'是相对路径,当用户访问站点根路径/时,浏览器会把页面中引用的media/xxx.jpg解析为/media/xxx.jpg,刚好能匹配你配置的媒体静态路由,所以功能表现正常。 - 当视图中触发
redirect跳转到非根层级的页面(比如/article/detail/5/这类多级路径页面)时,浏览器会基于当前页面的URL层级拼接所有相对路径资源:media/xxx.jpg会被解析为/article/detail/5/media/xxx.jpg,完全匹配不到媒体文件路由,所有图片自然全部返回404。
修复方案
- 修正
settings.py中的媒体路径配置,给MEDIA_URL加上前导斜杠,改为站点绝对路径:MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, "media") - 调整媒体路由的挂载位置:不要把
urlpatterns += static(...)写在单个应用的urls.py中,移到项目根urls.py的所有路由配置末尾,避免因为app路由被include到子路径前缀下,导致媒体路由被挂载到错误的子路径下失效。
根urls.py参考配置:from django.conf import settings from django.conf.urls.static import static from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # 其余业务路由、app引入配置 ] # 仅DEBUG模式下由Django接管媒体文件服务,生产环境需用Nginx等web服务器直接托管media目录 if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
补充注意点
如果修复后仍有偶发404,检查redirect的写法:
- 不要直接写
redirect('media/xxx.jpg')这类相对路径跳转,跳转媒体资源时要写绝对路径redirect('/media/xxx.jpg'),或者通过reverse解析路由名生成标准路径,避免相对路径解析错位。
内容的提问来源于stack exchange,提问作者itsdiy0
相关产品推荐
相关产品推荐

