如何在 Flask Web 应用程序中让用户在客户端下载文件?

How to make user download files client-side in a Flask web application?

我正在尝试使用 Youtube-dl Python API 使用 Flask 构建 YouTube 下载器。一切正常,但我在实际下载视频时遇到问题。

@app.route("/pytube/video/", methods=["POST", "GET"])
def pytube_video():
    if request.method == "POST":
        pytube_download("https://www.youtube.com/watch?v=kFZ-pW4G-s8", "313")
        return send_file("./videos/test.mp4", as_attachment=True)


@app.route("/pytube/download/", methods=["POST", "GET"])
def pytube_download(url, format_id):
    options = {
        'format': format_id,
        "outtmpl": "./videos/test.mp4",
    }

    with youtube_dl.YoutubeDL(options) as y:
        y.download([url])

这个过程有效,但它可能会很慢,因为我是在本地下载视频然后发送它们。有没有办法让用户更直接的下载视频,而不是先在后台下载?

很明显,您正在进行服务器端处理,首先下载 Youtube 视频,然后将其作为附件发送给用户。进行下载的主要引擎 (youtube-dl) 位于您的后端服务器中,而不是在最终用户的 PC 中,以便获得您建议的内容。

有两种方法可以解决此问题:

除了使用 y.download([url]) 下载视频外,您还可以像下面这样提取信息:

from flask import jsonify


with youtube_dl.YoutubeDL(options) as y:
        try:
            r = y.extract_info(url, download=False)
            return jsonify(r)
        except:
            return jsonify({'error':'An error has occured'})

然后你可以解析json响应来提取下载link和return给用户,这样用户将直接从视频主机cdn下载而不是消耗带宽从你的后端。