2016-02-19 60 views
1

说我有这样的路线,呈现lol.htmlb设置为none:烧瓶 - 添加变量到另一个路线的回应?

@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) 
+0

你是什么意思“添加变量到另一个路线的回应”。你是说用新变量渲染模板? –

回答

2

瓶大多是纯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") 

更新: 如果你不想原始视图要包含扩展逻辑,您必须记住视图返回的是渲染模板,这是不可扩展的 - 您不能简单地在foo视图内添加更多行。

一种替代方法是将渲染器本身变成一个懒惰的对象 - 将延迟调用烧瓶实际上render_template,以便它是可修改的。为了让您了解这个修改过的render_template,您可以通过一个简单的视图来接受渲染器作为参数。

所以,

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


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

应该为你工作 - 你可以使“渲染器”是一个更聪明的对象,其中,可以根据需要插入更多的事情。

+0

这种方法的问题在于,我必须将扩展逻辑合并到要扩展的视图中,而不是扩展视图本身。 –

+0

好主意!两点 - 我不明白'render_hub',它看起来像你有一个错误在第3行。我已经编辑了我的答案,你的解决方案的一个稍微修改版本的工作。在将此标记为解决方案之前,请您先编辑您的答案吗? –

+0

实际上这条线是不受欢迎的,并且刚刚从以前的版本悬挂。我现在删除它, – jsbueno