如何在一个请求中为Flask提供多个文件?

问题描述 投票:0回答:1

我正在尝试重定向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>
redirect flask static dynamic-url
1个回答
0
投票

我认为您过于复杂。您的问题的第一个版本也更清晰,因此基于此...

无法像您尝试的那样用一个app.route装饰器装饰多个功能。组合起来的方法可能是让watch路由呈现模板,然后拥有vidsub路由,当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函数呈现vidsub路线的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中传递这些变量,但可能值得一提的是,这并不是提供视频内容的最佳方法。如果您想通过浏览器查看自己的媒体收藏,可能会做。

© www.soinside.com 2019 - 2024. All rights reserved.