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

Django静态文件夹图片显示404问题求助

Django 图片404问题排查与修复

核心问题分析

你的问题主要出在媒体文件配置错误、模板标签使用不当以及图片路径返回不完整这几个点上,具体如下:

  1. 模板里的{% static '{{ graph_url }}' %}是无效语法——Django模板标签内不能嵌套双花括号变量,且生成的图表属于媒体文件(media)范畴,不该用静态文件(static)标签访问。
  2. MEDIA_ROOT配置错误,导致媒体文件存储路径与访问路径不匹配。
  3. make_graph仅返回文件名,未包含图片在媒体目录下的相对路径,无法正确拼接访问URL。
  4. 开发环境未配置媒体文件的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)

验证步骤

  1. 重启开发服务器,上传文件生成图表。
  2. 检查图片实际存储路径:项目根目录/media/graphs/xxx_forecast.png。
  3. 查看页面中img标签的src属性,应为/media/graphs/xxx_forecast.png,直接访问该URL应能打开图片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:16:20