【问题标题】:How to serve a video(s) file from Django app to play in the browser?如何从 Django 应用程序提供视频文件以在浏览器中播放?
【发布时间】:2015-09-03 01:43:31
【问题描述】:

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

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

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

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

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

附:电影文件路径存储在 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

【问题讨论】:

  • 是的,我今天早上指的是那个 这就是我将它包含在页面中的方式。问题是电影不能播放。我需要从静态文件夹中提供服务吗?但所有文件路径都存储在数据库中。
  • movie 是文件字段吗?请将您的模型添加到问题中。
  • 不,这是一个 CharField
  • 您可以将您的型号代码添加到问题中吗?

标签: python django html video web-frameworks


【解决方案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 admin 上传这些文件,那么它们将被上传到 MEDIA_ROOT,并且它们的 .url 属性将与此相关。例如:

/movie/top_gun.mp4

对于大多数网站,我通常将MEDIA_ROOT 放在STATIC_ROOT 下,以便在开发或生产中轻松地为它们服务。

【讨论】:

  • "{{ movie.file_path }}" 也是我在源代码中使用的。路径是绝对的。 /home/user/Downloads/movie/top_gun.mp4
  • 开发中的静态文件应用程序是否提供下载目录?要么 ?它只是在本地失败吗?还是在您的生产现场?
  • 静态文件应用程序(使用开发服务器)未提供下载目录。还没有生产站点。
  • 您的STATICFILES_DIRS 设置是什么?
  • STATIC_PATH = os.path.join(BASE_DIR, 'static') STATICFILES_DIRS = (STATIC_PATH, )
【解决方案2】:

如果找到路径,则在模板 html 中类似 jinja 的代码末尾添加 .url,并且必须在视频标签中,如下所示:

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

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 2012-05-25
    • 2019-04-25
    • 2020-12-08
    • 2011-10-18
    • 2020-12-25
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多