【问题标题】:Playing Video with Django and html5 tag使用 Django 和 html5 标签播放视频
【发布时间】:2014-01-24 01:17:23
【问题描述】:

我正在尝试使用带有 html5 视频标签的 django 播放视频,但不能。
主要问题是服务器无法获取video 文件。
我收到了这个错误:

[06/Jan/2014 23:52:07] "GET absolute_path_of_media/sample.mp4 HTTP/1.1" 404 2422

在检查元素中:

在这里,我将向您展示我的代码。
模板/videoplay.html:

{% extends "app/base.html" %}
{% block contents %}
<video name='demo' controls autoplay width='50%' height='40%'>
<source src="{{media}}/sample.mp4" type="video/mp4"></source>
</video>
{% endblock %}

views.py:

def index(request):
    return render(request, "app/videoplay.html", {'media': MEDIA_ROOT}) 

我从 settings.py 中导入了MEDIA_ROOT,它是媒体目录的绝对路径。

开发环境:

browser: chrome 
django:1.6.1
python:2.7

静态和媒体目录的关系:

mysite/
      static/
            sample.mp4
      media/
            sample.mp4
      templates/
            ....
      views.py
      ....

【问题讨论】:

    标签: django html video html5-video


    【解决方案1】:

    您在文件 URL 的开头缺少斜杠,并且您不需要将 MEDIA_ROOT 传递到上下文中,请使用您在设置文件中设置的 {{ STATIC_URL }} 模板变量。

    为了从下面的 cmets 中澄清,您的 MEDIA_ROOT 设置是 django 存储媒体文件(用户上传)的位置。 STATIC_ROOT 是 django 查找静态文件(你的 js/css/images 等)的地方。

    模板中使用了STATIC_URLMEDIA_URL 设置。它们将被设置为 STATIC_URL = "/static/"MEDIA_URL = "/media/" 之类的东西,它们由 django 传递给模板,所以当你这样做时:

    <img src="{{ STATIC_URL }}sample.jpg" />
    

    <source src="{{ MEDIA_URL }}sample.mp4" type="video/mp4"></source>
    

    它将{{ STATIC_URL}} 替换为"/static/",因此您最终以"/static/sample.jpg" 作为django 用于从STATIC_ROOT 获取文件的src url。

    【讨论】:

    • 我将 src 更改为 &lt;source src="{{STATIC_URL}}sample.mp4" type="video/mp4"&gt;&lt;/source&gt; 并且成功了!!!谢谢 !但我不知道为什么它起作用以及为什么当我使用media 目录时它不起作用。我也试过这个:../media/sample.mp4,但是当我尝试../static/sample.mp4时它不起作用,它起作用了。我不知道为什么......你能解释一下原因吗?因为我想将videofiles 放入媒体目录。 (我把sample.mp4file 放在媒体和静态目录中)
    • 我的意思是:../../media/sample.mp4../../static/sample.mp4
    • 在您的 settings.py 文件中,您将定义STATIC_URL = /static/(或类似名称)。 Django 将 STATIC_URL 传递给您的模板。至于静态与媒体,我认为您不希望两者都包含视频文件。 static 用于您在网站上显示的网站内容(图像、javascript/css、视频等)。媒体用于用户上传的内容,例如用户为其个人资料上传的图片。
    • 嗯,我明白了。但是由于我正在创建用户可以上传他们的video files 并且他们可以播放那些video files 的Web 应用程序,所以django 需要访问媒体目录才能播放video files。还是我应该将用户上传的文件放入静态文件并播放它们?
    • 我尝试了 Timmy O'Mahony 的 answer,现在我可以播放媒体目录中的视频文件了。我理解django默认不支持媒体目录,我们需要告诉django的url路径。谢谢您的回答 !我可以更了解 django 了!
    【解决方案2】:

    你可以试试这个:

    {% load staticfiles %}
    <!DOCTYPE html>
    <html>
    <body>
    
    <video width="530" height="440" controls autoplay>
      <source src="{% static "mov_bbb.mp4" %}" type="video/mp4"> </source>
    </video>
    </body>
    </html>
    

    setting.py

    STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"), )
    

    view.py

    from django.views.generic.base import TemplateView
    
    
    class HomeView(TemplateView):
    
        template_name = 'home.html'
    

    urls.py

    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^$', views.HomeView.as_view(), name='home'),
    ]
    

    静态文件:

    static/
                mov_bbb.mp4
    

    【讨论】:

      【解决方案3】:

      您不想要目录的绝对路径。您需要实际提供媒体的 URL,可能类似于 "/static/sample.mp4"(或者您已配置 STATIC_URL

      【讨论】:

        猜你喜欢
        • 2014-02-10
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多