Django本地图片无法加载求助(原可正常显示)
问题排查与解决方案
看起来你的图片加载404问题核心出在URL路由的匹配逻辑上,我们一步步来解决:
1. 核心原因:Catch-All路由拦截了Media请求
你的urls.py最后一条路由:
url(r'([^/]*)', views.home, name='home'),
这个正则表达式没有使用^(路径开头)和$(路径结尾)限定符,会匹配任何请求路径的起始部分(包括/media/artists/fontaines.png这类多级路径),导致Django把Media资源请求错误地交给了home视图处理,根本没走到后面的静态资源路由。
2. 修复路由配置
把这条路由修改为仅匹配首页(根路径),或者严格匹配单级路径:
选项1:仅匹配首页(推荐)
如果home视图只负责处理根路径/,改成:
url(r'^$', views.home, name='home'),
选项2:匹配根路径下的单级页面
如果需要用home视图处理类似/about这类单级路径,改成:
url(r'^([^/]+)$', views.home, name='home'),
^([^/]+)$会严格匹配只有一级的路径,不会拦截/media/...这类多级路径。
修改后重启Django开发服务器,再访问图片路径试试。
3. 额外检查与优化
静态资源配置确认
你的settings.py和urls.py里的Media配置是正确的:
MEDIA_ROOT和MEDIA_URL路径设置无误- 已经在DEBUG模式下添加了
static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)路由
数据库配置精简
注意到你settings.py里的SQLite配置多了不必要的参数:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # 以下参数SQLite不需要,可删除避免混淆 'USER': 'affix', 'PASSWORD': 'robbrennan', 'HOST': '127.0.0.1', 'PORT': '5432', } }
验证
修复路由后,访问http://127.0.0.1:8000/media/artists/fontaines.png应该能直接看到图片,模板里的{{ artist.photo.url }}也能正常加载图片了。
内容的提问来源于stack exchange,提问作者Chris Brady
相关产品推荐
相关产品推荐

