Django静态文件夹图片显示404问题求助
Django 图片404问题排查与修复
核心问题分析
你的问题主要出在媒体文件配置错误、模板标签使用不当以及图片路径返回不完整这几个点上,具体如下:
- 模板里的
{% static '{{ graph_url }}' %}是无效语法——Django模板标签内不能嵌套双花括号变量,且生成的图表属于媒体文件(media)范畴,不该用静态文件(static)标签访问。 MEDIA_ROOT配置错误,导致媒体文件存储路径与访问路径不匹配。make_graph仅返回文件名,未包含图片在媒体目录下的相对路径,无法正确拼接访问URL。- 开发环境未配置媒体文件的HTTP访问路由,Django无法处理媒体文件的请求。
分步修复方案
1. 修正settings.py中的媒体/静态文件配置
把媒体文件配置改成Django标准写法,将媒体目录与静态目录分离:
STATIC_URL = 'static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') # 媒体文件配置(与static同级) MEDIA_URL = 'media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'project/static/static_files/'), # 移除原有的static/media/graphs配置,媒体文件不属于静态文件范畴 )
2. 修改make_graph函数,返回完整相对路径
确保返回的路径是相对于MEDIA_ROOT的完整路径,同时自动创建graphs目录避免报错:
def make_graph(forecast, df, cols, filename): plt.figure(figsize=(16,4)) plt.plot(df, label="Реальные значения", color="blue") plt.plot(forecast, label='Прогноз', color='red') plt.title(filename) plt.xlabel(cols[1]) plt.ylabel(cols[0]) plt.legend() figname = f'{filename}_forecast.png' # 确保graphs目录存在 graph_dir = os.path.join(settings.MEDIA_ROOT, 'graphs') os.makedirs(graph_dir, exist_ok=True) plt.savefig(os.path.join(graph_dir, figname)) # 返回相对于MEDIA_ROOT的路径 return f'graphs/{figname}'
3. 修正模板的图片引用逻辑
首先在settings.py的模板配置中添加媒体上下文处理器,让模板能直接访问MEDIA_URL变量:
TEMPLATES = [ { # 其他配置... 'OPTIONS': { 'context_processors': [ # 已有的处理器... 'django.template.context_processors.media', ], }, }, ]
然后修改results.html中的img标签,用媒体URL拼接路径:
<body> {% load static %} <p>{{ filename }}</p> <p>------------------------------------------------------</p> <div>{{ graph_url }}</div> <!-- 使用MEDIA_URL拼接图片路径 --> <img src="{{ MEDIA_URL }}{{ graph_url }}"> <!-- 其他内容不变 --> </body>
4. 配置开发环境的媒体文件路由
在项目根目录的urls.py中添加媒体文件访问路由,让开发服务器能正确返回媒体文件:
from django.conf import settings from django.conf.urls.static import static from django.urls import path urlpatterns = [ # 你的其他路由... ] # 仅在开发环境(DEBUG=True)下生效 if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
验证步骤
- 重启开发服务器,上传文件生成图表。
- 检查图片实际存储路径:
项目根目录/media/graphs/xxx_forecast.png。 - 查看页面中img标签的src属性,应为
/media/graphs/xxx_forecast.png,直接访问该URL应能打开图片。
内容的提问来源于stack exchange,提问作者riri
相关产品推荐
相关产品推荐

