如何从Django应用程序提供视频文件以在浏览器中播放?

时间:2015-06-17 17:10:12

标签: python django html5 video web-frameworks

我正在构建一个电影搜索网络应用程序(使用Django),它将基本上采用以(.mp4,.avi,.mpg等)结尾的电影文件文件夹。当我运行填充脚本时,MySQL数据库将填充有关该电影的信息。

其中一列是电影的file_path。我有一个模板,它会显示电影的一些基本信息,旁边有一个播放按钮。

当您点击播放按钮时,它会将您带到另一个页面(使用电影标题的slug)并且您将看到嵌入的视频。

问题: 当我点击嵌入视频的播放按钮时,电影是否无法播放。 视频的file_path存储在数据库中,然后传递到django模板(所以我可以看到路径)。

有没有办法让django访问这些电影文件路径,以便它们可以在浏览器中播放? (或使用默认的linux媒体播放器)。

P.S。电影文件路径存储在MySQL数据库中。

以下是模型:

class Film(models.Model):
    title = models.CharField(max_length=128, default='Blank', help_text='film title')
    year = models.CharField(max_length=15, help_text='release year', blank=True, null=True)
    rated = models.CharField(max_length=15, default=1, null=True, blank=True)
    released = models.CharField(max_length=128, default='Blank', help_text='release date')
    runtime = models.CharField(max_length=15, default='Blank', help_text='film length')
    genre = models.ManyToManyField(Genre, default=1, blank=True)
    director = models.ManyToManyField(Director, default=1, blank=True)
    type = models.CharField(max_length=20, default='filmdb', help_text='series, movie etc')
    actor = models.ManyToManyField(Actor, blank=True, verbose_name='Actor/Actress')
    writer = models.ManyToManyField(Writer, blank=True, verbose_name='Writer')
    award = models.CharField(max_length=128, default='Blank', null=True,help_text='film awards')
    country = models.ManyToManyField(Country, default=1, blank=True)
    language = models.ManyToManyField(Language)
    plot = models.TextField(max_length=256, help_text="Film plot", null=True, blank=True)
    poster = models.URLField(max_length=256, help_text='link to poster image', blank=True, null=True)
    imdb_id = models.CharField(max_length=15, default=1, null=True, blank=True)
    imdb_rating = models.CharField(max_length=15, null=True, blank=True)
    meta_score = models.CharField(max_length=10, null=True,blank=True)
    file_path = models.CharField(max_length=255, null=True, blank=True, default='N/A')
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Film, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.title + self.year

3 个答案:

答案 0 :(得分:1)

在不知道路径是绝对路径还是相对路径的情况下,您应该使用:

<video width="320" height="240" autoplay>
    <source src="{{ movie.file_path }}" type="video/mp4"> Your browser does not support the video tag.
</video>

除此之外,我将使用相对路径,而不是绝对路径。这些文件必须由Apache,Nginx或Django的内置服务器提供服务。

这些文件的路径实际上应该与它们所服务的目录相关。例如,如果您通过Django管理员上传这些文件,则会将其上传到MEDIA_ROOT,并且他们的.url属性将与此相关。 E.g:

/movie/top_gun.mp4

对于大多数网站,我通常将MEDIA_ROOT放在STATIC_ROOT下,这样我就可以在开发或制作中轻松地为它们提供服务。

答案 1 :(得分:0)

我找到了一个解决方案并且暂停了这个电影网站项目以使用像Bottle和amp;这样的小框架提高我的技能。烧瓶中。

无论如何,当用户点击电影页面视图上的播放按钮时,我有该URL调用另一个视图,该系统调用VLC程序。由于文件路径是电影模型的一部分,我将其传递给VLC作为参数。所以每当我点击一部电影观看时,VLC就会打开。

缺点: - 只显示正在运行Django Film App的系统上的电影,而不是在浏览器中显示视频,用户将从另一台计算机上观看视频。

更新: 仍然没有找到Django解决方案。但这是我找到的boxcontrol - flask media streaming

的Flask示例

答案 2 :(得分:0)

如果找到了路径,则将 .url 添加到模板html中jinja之类的代码的末尾,并且必须位于视频代码中,如下所示:

<video controls src="{{ Tutorials.attachments.url }}"></video>