2

我有一个简单的烧瓶服务器。我使用 pafy 从用户提供的 youtube 链接下载了一个视频。

@app.route('/')
def download():
    return render_template('basic.html')

basic.html 模板有一个提交下载操作的表单:

<form action="download_vid" method="post">
Link: <input type="text" name="download_path"><br>
<input type="submit" value="Submit">
</form>

我有另一个端点, /download_vid 看起来像这样。

@app.route('/download_vid', methods=['POST'])
def download_vid():
    url = request.form['download_path']
    v = pafy.new(url)
    s = v.allstreams[len(v.allstreams)-1]
    filename = s.download("static/test.mp4")
    return redirect(url_for('done'))

所需的链接确实以 .mp4 文件的形式下载到我的静态文件夹中。如果我在本地打开它,我可以观看它,也可以将它用作 HTML 文件中标签的来源。

@app.route('/done')
def done():
    return app.send_static_file('test.mp4')

据我了解,“send_static_file”提供静态目录中的文件。但是,当我运行服务器时,我得到一个 404 错误,即使视频显然在那里。

我还为 done() 尝试了不同的版本:

@app.route('/done')
def done():
    return return render_template('vid.html')

在这里,vid.html 驻留在模板中,并具有到 static/test.mp4 的硬编码路径。下载完成后加载。在这种情况下,我没有 404 错误,但标签什么也没做,它只是灰色的。如果我在本地打开 vid.html(双击它),它可以工作,它会显示视频。

你能帮我理解发生了什么吗?

我想要实现的是:

  1. 从用户那里获取输入[完成]
  2. 使用该输入下载视频 [完成]
  3. 将该视频返回给用户 [ ??? ]
4

1 回答 1

4

我认为您在文件路径或文件权限方面有问题。

  • 视频是否正在下载到static目录中?
  • static目录是否与您的main.py文件在同一目录中?
  • 您的烧瓶应用程序是否有权读取文件?

我认为您的文件未在 html 模板中加载的原因是因为您static/test.mp4从 url 引用它 -/done它将视频路径转换为/done/static/test.mp4​​.

您可以重定向到实际的媒体文件,而不是尝试使用 Flask 推送文件。

@app.route('/done')
def done():
    return redirect('/static/test.mp4')
于 2015-12-12T01:40:13.410 回答