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

Django加载外部存储MP4失败:页面未找到问题求助

问题根源分析
  1. 路径类型混淆:你直接将本地文件绝对路径(/vol/web/media/36/movies/movie.mp4)传给video标签的src,浏览器会把该路径识别为网站内部URL路径发起请求,而非访问本地文件,导致触发Django路由匹配但找不到对应规则。
  2. 媒体根路径不匹配:你的MEDIA_ROOT配置为BASE_DIR/media,但实际文件存储在外部卷/vol/web/media下,即使走Django媒体服务也无法定位文件。
解决方案

1. 修正媒体根路径配置

修改settings.py,将MEDIA_ROOT指向实际外部存储路径:

# settings.py
MEDIA_ROOT = '/vol/web/media/'
MEDIA_URL = '/files/'  # 保持原配置不变

2. 生成可访问的媒体URL而非本地路径

在views.py中,不要直接传递本地绝对路径,而是基于MEDIA_URL生成浏览器可识别的URL:

# views.py
from django.conf import settings
from urllib.parse import urljoin

class SingleTestView(View):
    def get(self, request, test_session_id, test_name):
        run = Runner.objects.get(id=test_session_id)
        
        # 生成相对于MEDIA_ROOT的路径(核心:不要用绝对路径)
        movie_relative_path = f"{run.id}/movies/{test_name.replace('-', '_')}.mp4"
        # 拼接成完整的媒体访问URL
        movie_url = urljoin(settings.MEDIA_URL, movie_relative_path)

        context = {
            'movie_path': movie_url
        }

        return render(request, "presenter/single_test.html", context)

注:如果run.artifacts_dir_path已经是相对MEDIA_ROOT的路径,可以直接基于它拼接,核心是避免传递本地绝对路径。

3. 确保媒体文件可被正确访问

开发环境

在项目根urls.py中添加媒体文件路由,让Django临时处理媒体请求:

# 项目根urls.py
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 你的现有路由...
    path('admin/', admin.site.urls),
    # ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

生产环境

禁止用Django服务媒体文件,配置Nginx等反向代理直接映射路径,示例Nginx配置片段:

location /files/ {
    alias /vol/web/media/;
    expires 30d;
    add_header Cache-Control "public, max-age=2592000";
}

4. 验证最终渲染结果

页面渲染后的video标签应类似如下格式,而非本地绝对路径:

<video width="320" height="240" controls>
  <source src="/files/36/movies/movie.mp4" type="video/mp4">
</video>
额外检查项
  • 确认外部存储卷/vol/web/media的权限:Django进程(或Nginx)需拥有该目录的读取权限
  • 核对文件名后缀:错误提示中出现movie.mt4,但代码中生成的是.mp4,需保证后缀一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:25:27