Python 在Heroku上使用Django将大文件上载到AWS S3 Bucket,无需30秒请求超时

Python 在Heroku上使用Django将大文件上载到AWS S3 Bucket,无需30秒请求超时,python,django,heroku,amazon-s3,large-files,Python,Django,Heroku,Amazon S3,Large Files,我有一个django应用程序,允许用户上传视频。它托管在Heroku上,上传的文件存储在S3存储桶上。 在从Django应用程序获得预先签署的请求后,我使用JavaScript将文件直接上传到S3。这是由于Heroku 30s请求超时。 不管怎样,我可以通过Django后端上传大文件,而不使用JavaScript并损害用户体验。你应该考虑下面的一些要点来解决你的问题。 为什么您的文件不应该先到django服务器,然后再到s3:将文件发送到django服务器,然后再将其发送到s3只是浪费计算能力

我有一个django应用程序,允许用户上传视频。它托管在Heroku上,上传的文件存储在S3存储桶上。 在从Django应用程序获得预先签署的请求后,我使用JavaScript将文件直接上传到S3。这是由于Heroku 30s请求超时。
不管怎样,我可以通过Django后端上传大文件,而不使用JavaScript并损害用户体验。

你应该考虑下面的一些要点来解决你的问题。

  • 为什么您的文件不应该先到django服务器,然后再到s3:将文件发送到django服务器,然后再将其发送到s3只是浪费计算能力和带宽。下一个缺点是,当您可以直接将文件发送到s3存储时,为什么要将文件发送到django服务器
  • 如何在不影响用户体验的情况下将文件上传到s3:将文件发送到django服务器肯定不是一个选项,所以您必须在前端处理这个问题。但前端有其自身的局限性,比如内存有限。它将无法处理非常大的文件,因为所有内容都被加载到RAM中,如果它是一个非常大的文件,浏览器将最终耗尽内存。我建议你使用类似的东西。它不会解决内存问题,但肯定能为用户提供良好的用户体验,如显示进度条、文件数量等

    • 另一个答案中的点是有效的。对于“我是否有可能通过Django后端上传大文件而不使用JavaScript”这一问题的简短回答是“没有切换到Heroku”

      请记住,任何传输到dynos的数据都要经过Heroku的路由网格,这就是执行30秒请求限制以节省其自身有限资源的原因。任何类型的长时间运行的事务都会占用带宽/计算/等,这些带宽/计算/等可以用于服务其他请求,因此Heroku应用了该限制,以帮助在数千个动态节点之间保持移动。上载文件时,首先会受到服务器的客户端带宽的限制。然后,您将受到dyno和S3之间带宽的限制,这是dyno实际执行的任何处理之上的限制


      文件越大,传输数据越有可能超过30秒超时,特别是在步骤1中,对于不可靠网络上的客户端。创建从客户端到S3的直接路径是一个合理的折衷方案。

      从浏览器上载会带来安全风险,不是吗?你不会最终暴露出秘密和api密钥吗?当然会,但在浏览器的情况下,你必须使用临时凭据。这些凭据具有访问策略和过期时间,因此不会造成安全威胁。你可以在aws S3文档中找到更多关于它的信息,如果是这样的话,“流式传输”文件就不会工作了吗?我不熟悉AWS JS SDK,但如果上传和S3处理程序都可以被视为套接字,那么它就变成了从一个套接字读取并向另一个套接字写入的情况,那么关闭两个套接字并不是唯一的用途。在这个问题的上下文中,流式传输文件是什么意思。因为它是一个文件,所以只能流式传输,而您不能通过流式传输发送整个文件。@omu_negro只有api密钥被公开(这没关系,它应该包含在所有请求中)。您将密钥保存在服务器上的Django app/中,并使用该密钥生成浏览器使用的临时签名URL。我认为本文满足了您的需要,适用于非heroku环境。您是否正在使用AWS SDK for javascript?用户体验不应该受到损害,它看起来前端是完全可定制的。唯一的区别是上传视频和照片。另外,为什么您认为用户体验会受到影响?以上听起来是解决这个问题最具成本效益、技术上最有效、最正确的方法。