Redirect 如何在一个请求中为Flask中的多个文件提供服务,以便在模板中使用?

Redirect 如何在一个请求中为Flask中的多个文件提供服务,以便在模板中使用?,redirect,flask,Redirect,Flask,我正在尝试重定向Flask中的URL。e、 g:localhost/x/e/f/i.mp4。其中e和f是指向另一个URL的整数输入(没有实际的文件),该URL实际具有文件名i.mp4。e、 glocalhost/static/i.mp4 此URL是模板中请求的一部分。但是使用该模板,它将请求i.mp4,即localhost/e/f/i.mp4。我尝试使用add_url_规则,端点为redirect_to=send_from_directory(something),send_from_direc

我正在尝试重定向Flask中的URL。e、 g:
localhost/x/e/f/i.mp4
。其中e和f是指向另一个URL的整数输入(没有实际的文件),该URL实际具有文件名
i.mp4
。e、 g
localhost/static/i.mp4

此URL是模板中请求的一部分。但是使用该模板,它将请求i.mp4,即
localhost/e/f/i.mp4
。我尝试使用add_url_规则,端点为
redirect_to=send_from_directory(something)
send_from_directory
在模板之后,
send_from_directory
在模板之前,但这只发送mp4。 Flask当前的代码片段如下

@app.route('/watch//',methods=['GET'])
def视频(s、ep):
返回app.add_url_规则(f'/watch/{s}/{ep}/s{s}-{ep}sub.m4v',重定向_到=从_目录发送_('static',f的{s}-{ep}sub.m4v'))
def接头(s、ep):
返回app.add_url_规则(f'/watch/{s}/{ep}/s{s}-{ep}.vtt',重定向到=从_目录发送_('static',f的{s}-{ep}.vtt'))
def手表(s、ep):
返回呈现模板('watch.html',s=s,ep=ep)
模板如下所示:


{{s}}-{ep}

我觉得你把事情复杂化了。而且你的问题的第一个版本更清晰,因此基于此

不可能像您尝试的那样,用一个
app.route
decorator来修饰多个函数。将其组合在一起的方法可能是让您的
watch
路由呈现模板,然后使用
vid
sub
路由,当
watch
页面加载时,浏览器会点击该路由:

@app.route('/vid/<int:s>/<int:ep>')
def vid(s,ep):
    return send_from_directory('static', f'S{s}-{ep}sub.m4v')

@app.route('/sub/<int:s>/<int:ep>')
def sub(s, ep):
    return send_from_directory('static',f'S{s}-{ep}.vtt')

@app.route('/watch/<int:s>/<int:ep>', methods=['GET'])
def watch(s, ep):
    return render_template('watch.html', s=s, ep=ep)


虽然上面展示了如何在Flask中传递这些变量,但可能值得一提的是,这并不是提供视频内容的最佳方式。如果您想通过浏览器查看您自己的媒体收藏,它可能会这样做。

因此模板会将
/watch
中使用的变量传递到
/vids
/sub
?是的。我的第二个代码块中的第一个
{{url\u for()}}
函数将url呈现为:类似于
/vid/01/02
的内容,并提供文件
static/S01-02.vtt
。但是,值得注意的是,通过使用此方法(从_目录发送_),应用程序服务器正在处理该文件。这可能应该留给反向代理。确实要使用
{{url\u for('static',filename=filename)}
然后将在python中为
filename
计算的值传递给render\u模板函数。这仍然不能解决它不是提供视频文件的最佳方式的问题。
<source src="{{ url_for('vid', s=s, ep=ep) }}" type="video/mp4">
<track label="English" kind="subtitles" srclang="en" src="{{ url_for('vid', s=s, ep=ep)}}" default>