Flask - 将变量添加到另一个路径的响应中?

时间:2016-02-19 16:05:20

标签: python flask

假设我有这样的路线,将lol.html设为无b呈现:

@app.route('/foo/')
def foo():
    return render_template('lol.html', a='a', b=None)

我想制作另一条路线,它可以拦截一条路线并在返回之前添加一些变量。像这样:

@app.route('/bar/')
def bar():
    intercepted = make_response(foo())
    # do something signficant to extend the logic of foo
    flask.add_var_to_resp(intercepted, b='b')

如何在烧瓶中完成?

@jsbueno,我正在添加此内容以澄清您的答案,我在评论中无法做到:

@app.route('/foo/')
def foo(renderer=render_template):
    return renderer('foo.html', a='a')

@app.route('/bar/')
def bar():
    def renderer(template, *args, **kwargs):
        return render_template(template, *args, b='b', **kwargs)
    return foo(renderer)

1 个答案:

答案 0 :(得分:2)

Flask主要是纯Python,没什么神奇之处 - 所以你可以使用一系列策略。

也许最简单的方法是让主视图接受可选项 函数参数,并从扩展视图中调用它:

@app.route('/foo/')
def foo(b=None):
    return render_template('lol.html', a='a', b=b)

@app.route('/bar/')
def bar():
    return foo(b="b")

<强>更新: 如果您不希望原始视图包含扩展逻辑,则必须记住视图返回渲染模板,这是不可扩展的 - 您不能在{{1}内添加更多行查看。

另一种方法是将渲染器本身变成一个惰性对象 - 这会延迟对flask实际foo的调用,以便它可以修改。对于一个简单的视图继续工作,你应该知道这个修改过的render_template,它可以在opionally接收渲染器作为参数。

所以,

render_template

应该适合你 - 你可以制作&#34;渲染器&#34;是一个更聪明的对象,你可以根据需要插入更多的东西。