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

Django搭建家庭媒体服务器:外接USB视频无法加载问题求助

解决Django访问外接USB设备中媒体文件的问题

问题根源

直接在模板里写本地绝对路径(比如E:/OneLastTime.mp4)是行不通的——浏览器是向Django服务器请求资源,而不是直接读取服务器本地的文件系统。Django默认不会暴露非MEDIA_ROOT/STATIC_ROOT之外的路径,所以即使文件存在,服务器也不会把它返回给浏览器。

解决方案:配置自定义媒体路径的URL映射

我们可以让Django专门处理USB设备路径的请求,把本地文件转换成可访问的Web URL,完全不需要把文件移到Django的media目录。

1. 在settings.py中添加USB媒体配置

首先定义USB设备的根路径和对应的URL前缀:

import os
from pathlib import Path

# 替换成你的USB设备实际路径(Windows下是E:/,Linux/macOS可能是/mnt/usb之类的)
USB_MEDIA_ROOT = "E:/"
# 浏览器访问这个URL前缀来获取USB里的媒体文件
USB_MEDIA_URL = "/usb-media/"

2. 在项目urls.py中添加路由映射

添加一个路由,让Django的serve视图处理/usb-media/开头的请求,指向USB的根目录:

from django.conf import settings
from django.conf.urls.static import serve
from django.urls import path, include

urlpatterns = [
    # 你的其他路由(比如admin、app路由)
    path('admin/', admin.site.urls),
    path('', include('MediaPlayer.urls')),
    
    # 处理USB媒体文件的路由
    path('usb-media/<path:path>', serve, {
        'document_root': settings.USB_MEDIA_ROOT,
    }),
]

注意:serve视图只适合开发环境使用。如果要部署到生产环境,建议用Nginx/Apache直接配置静态文件服务(后面会讲)。

3. 修改视图函数,生成正确的Web URL

把本地文件路径转换成对应的/usb-media/开头的URL,而不是直接传递本地路径给模板:

import os
from django.conf import settings
from django.shortcuts import render

def select_video_page(request, video_id):
    file_path = FILE_SCANNER.files["video"][video_id]
    
    # 计算文件相对于USB根目录的相对路径
    relative_path = os.path.relpath(file_path, settings.USB_MEDIA_ROOT)
    # 拼接成Web可访问的URL,注意把Windows的\换成URL的/
    video_url = os.path.join(settings.USB_MEDIA_URL, relative_path).replace("\\", "/")
    
    context = {
        "video_url": video_url,
        "title": '.'.join(file_path.split("\\")[-1].split(".")[:-1])
    }
    return render(request, "MediaPlayer/selectvideopage.html", context)

4. 更新模板使用正确的URL

把模板里的src改成视图传递的video_url:

{% extends 'MediaPlayer/layout.html' %}
{% block MainContent %}
<video width="640" height="360" controls>
    <source src="{{ video_url }}" type="video/mp4">
</video>
<p><b>Note:</b> The autoplay attribute will not work on some mobile devices.</p>
{% endblock %}
{% block PageScripts %}
{% endblock %}

额外注意事项

  • 权限问题:确保运行Django的用户有访问USB设备的权限。比如Linux下挂载USB时要设置正确的权限,Windows下要确保USB不是只读模式。
  • 生产环境部署:如果要把服务器放到生产环境,不要用Django的serve视图,性能和安全性都不够。以Nginx为例,你可以在配置文件中添加:
    location /usb-media/ {
        alias /mnt/usb-drive/;  # 替换成你的USB实际挂载路径
        autoindex off;  # 关闭目录索引,避免暴露文件列表
    }
    
    这样Nginx会直接处理媒体请求,不需要经过Django,效率更高。
  • 跨平台兼容性:如果你的服务器可能在不同系统运行,建议用pathlib来处理路径,避免硬编码的分隔符问题:
    from pathlib import Path
    
    usb_root = Path(settings.USB_MEDIA_ROOT)
    file_path_obj = Path(file_path)
    relative_path = file_path_obj.relative_to(usb_root)
    video_url = f"{settings.USB_MEDIA_URL}{relative_path}"
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:52:34