Django加载外部存储MP4失败:页面未找到问题求助
问题根源分析
- 路径类型混淆:你直接将本地文件绝对路径(
/vol/web/media/36/movies/movie.mp4)传给video标签的src,浏览器会把该路径识别为网站内部URL路径发起请求,而非访问本地文件,导致触发Django路由匹配但找不到对应规则。 - 媒体根路径不匹配:你的
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
相关产品推荐
相关产品推荐

