在 Django 网站上将 youtube 视频下载到用户机器

Download youtube video to user machine on Django website

问题的意思差不多。现在我使用 pytube 有这个功能:

    def download(request, video_url):
        url='http://www.youtube.com/watch?v='+str(video_url)
        homedir = os.path.expanduser("~")
        dirs = homedir + '/Downloads'
        download = YouTube(url).streams.first().download(dirs)   
        return redirect('../../')

但这会将视频下载到 pythonanywhere 中的目录 /Downloads/ - 我已将项目上传到的站点。

如何将视频下载到用户的机器上?解决方案不必使用 pytube 包,因为我只想要一个答案。如果您能告诉我如何将文件也下载为 .mp3 文件,那就太好了。

提前致谢。

我也发布了同样的问题,但我将这个问题减少了 80%... 所以,请参阅我的解决方案,我希望你能帮助解决这个问题:)

第一个导入模块

from django.http import FileResponse

然后代码...

return FileResponse(open(YouTube(url).streams.first().download(skip_existing=True),'rb'))

不能使用return重定向功能,可以使用FileResponse功能

问题

当您是 运行 远程计算机上的程序(这是您在 pythonanywhere 的服务器)时,所有操作都发生在该远程计算机上,而不是用户的机器上。

因此,当您在远程计算机上下载某些内容时,它会被下载到远程计算机 (pythonanywhere)。

一个解决方案

为了满足您的要求(将文件下载到用户的计算机,而不是服务器),您可能会这样做:

  • 在本地从 youtube 下载文件(就像您目前使用 YouTube....download() 所做的那样)。
  • 将文件发送给用户。这就是 试图用 django 的 FileResponse
  • 做的事情

为什么会这样?

每次您在浏览器中访问您的页面时,您的 Django 应用程序都会大致执行以下操作:

  • 收到用户的请求
  • 然后return是一个回应

通常 Django 应用程序会 return 一个 HTML 页面。但是 HTML 页面只是一个文件,您正在下载的 Youtube 视频也是如此。然后您可以选择发回视频文件而不是网页。然后用户的浏览器将尝试打开该文件。

如何选择下载位置?

您的 Django 应用程序无法选择用户计算机上的下载位置。如果任何网站可以在任何位置下载您计算机上的文件,这将是一件危险的事情。

但是,当您将文件发送给用户时,他们可以选择下载文件的位置。

如果您查看 the documentation for FileResponse,您会发现可以传递 as_attachment=True 参数。

这将使 Django 将文件作为 "attachment" 发送,这意味着它将尝试下载它而不是打开它。这将提示用户选择文件的下载位置。