我正在尝试重定向Flask中的URL。例如:localhost/x/e/f/i.mp4
。其中e和f是另一个URL的整数输入(没有实际文件),该URL实际上具有文件名i.mp4
。例如localhost/static/i.mp4
。此URL是模板中请求的一部分。但是使用模板,它将请求i.mp4,即localhost/e/f/i.mp4
。我尝试使用add_url_rule,端点为redirect_to=send_from_directory(something)
,模板后为send_from_directory
,模板前为send_from_directory
,但这仅发送mp4。Flask当前的代码段是这个。
@app.route('/watch/<int:s>/<int:ep>/', methods=['GET'])
def vid(s,ep):
return app.add_url_rule(f'/watch/{s}/{ep}/S{s}-{ep}sub.m4v', redirect_to=send_from_directory('static', f'S{s}-{ep}sub.m4v'))
def sub(s, ep):
return app.add_url_rule(f'/watch/{s}/{ep}/S{s}-{ep}.vtt', redirect_to=send_from_directory('static',f'S{s}-{ep}.vtt'))
def watch(s, ep):
return render_template('watch.html', s=s, ep=ep)
模板是这个:
<!DOCTYPE html>
<html lang="en" style="height:100%;">
<head>
<title>{{s}}-{{ep}}</title>
</head>
<body style="margin:0; text-align: center; height:100%;">
<video autoplay=" "controls="" style="margin: 0 auto; height:100vh;">
<source src="S{{s}}-{{ep}}sub.m4v" type="video/mp4">
<track label="English" kind="subtitles" srclang="en" src="S{{s}}-{{ep}}.vtt" default>
</video>
</body>
</html>
我认为您过于复杂。您的问题的第一个版本也更清晰,因此基于此...
无法像您尝试的那样用一个app.route
装饰器装饰多个功能。组合起来的方法可能是让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)
然后在模板中,您可以使用url_for
函数呈现vid
和sub
路线的URL:
<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>
尽管上面显示了如何在Flask中传递这些变量,但可能值得一提的是,这并不是提供视频内容的最佳方法。如果您想通过浏览器查看自己的媒体收藏,可能会做。