【问题标题】:uploading videos in Djnago rest framework在 Django rest 框架中上传视频
【发布时间】:2022-01-18 17:07:48
【问题描述】:

我创建了一个帖子 api,它将为博客上传图片和视频。我可以处理多个图像,这不是问题。但我也必须从前端发送视频。我已将 Filefield 用于视频。我不是 apis 专家,但我认为,由于我编写的代码是同步的,所以我编写的所有内容都会同时完成。现在的问题是,如果用户想要上传一个非常大的视频,例如 200-500 mb,那么 post api 调用响应将会很长。有没有办法先保存博文,返回响应,然后开始上传直播服务器数据库中的视频。

我的模型:

class Blogposts(models.Model):  
        
    blog_title = models.CharField(max_length=100blank=True)   

    video  = models.FileField(upload_to="media",                             
                                     null= True)

我尝试使用 django 信号,但是 django 信号也是同步的。我上面所说的一切也可能是错误的,我不确定。但是如何解决这个问题?还是我应该使用 django celery??

【问题讨论】:

  • 单独请求视频?
  • 我不知道什么是最好的方法...我的想法是先创建一个没有视频的博客文章,然后开始异步上传视频。
  • 是的。只需创建两个单独的请求。创建帖子,取回它的ID。然后上传视频,使用 id 将其附加到正确的帖子中。
  • hmn,...在前端本身的表单上上传视频所花费的时间呢??
  • 理想情况下,您不会使用普通形式,而是使用某种 JS 在后台执行fetch

标签: django api django-rest-framework django-celery django-signals


【解决方案1】:

DRF 已经有部分更新。用那个。这意味着,您仅对非文件字段发出发布请求。将视频字段设为空白 true null tr​​ue。

成功完成后,您会返回帖子的 ID 作为响应。然后发出补丁请求以上传文件。

您的 javascript 算法大致如下所示

const handleFormSubmit => (data) {
  file = data.video_file;
  delete data.video_file;
  axios.post('/blogs/', data).then(response => {
    updateUiShowCreatedBlogWithVideoUploading();

    id = response.id;
    fileUploadRequestData = {
      file: file
    }
    axios.patch('/blogs/${id}/', file).then(response => {
      updateUiShowCreatedBlogWithVideoUploaded();
    });
  });
}

但一般来说,对于大文件,我会直接从浏览器将其上传到对象存储(如 S3),而不会打扰 django 进程。完成后,像在补丁中一样附加对象。在这种情况下,您的模型将只是一个 URL 字段而不是 FileField。

如果太多,至少使用 django-storages 并让库处理从后端上传到 S3。

【讨论】:

  • s3 如果我们使用 aws 作为后端的服务器,使用?如果我们使用数字海洋或类似 @Amrit 的东西怎么办??
  • 任何对象存储都可以。 DigitalOcean Spaces 具有与 S3 相同的 API。但我还没有尝试过使用 Spaces 存储浏览器。 Plus 视频一般来说有点过于复杂,最好单独处理。上传只是其中的一部分。然后转码和服务。如果您直接从您的虚拟机提供服务,您很快就会达到传输限制。
  • 所以正如你所说“DRF 已经有部分更新。使用它。意思是,你只对非文件字段发出发布请求。使视频字段为空 true null tr​​ue。一旦成功完成,你得到你的帖子的ID作为回应。然后发出补丁请求来上传文件。“通过这样做,它会解决你在服务等中所说的问题吗?我还要提出 put 请求或补丁吗??
  • 一点也不。它只是解决了您的异步问题 - 使用户无需等待所有 200MB 上传完成。其余的实际上取决于您的要求。如果您是唯一一个上传视频的人 - 不用担心,FileField 可以使用 django-storages 设置(启用 CDN 的 DO Spaces 解决了服务问题)。您负责在本地制作带宽/用户设备友好的视频。否则结帐aws.amazon.com/elastictranscoder。很多年前我也做了一些东西transcode.io,但从未设法卖掉它:p
  • @Reactoo 我看到你还没有将此标记为答案。如果您还有任何疑问,请告诉我:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 2013-12-26
  • 2018-08-17
  • 2016-10-25
  • 2016-10-12
  • 2016-02-16
  • 2021-09-27
相关资源
最近更新 更多