烧瓶 - 添加变量到另一个路线的回应?
说我有这样的路线,呈现lol.html
与b
设置为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)
瓶大多是纯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)
应该为你工作 - 你可以使“渲染器”是一个更聪明的对象,其中,可以根据需要插入更多的事情。
这种方法的问题在于,我必须将扩展逻辑合并到要扩展的视图中,而不是扩展视图本身。 –
好主意!两点 - 我不明白'render_hub',它看起来像你有一个错误在第3行。我已经编辑了我的答案,你的解决方案的一个稍微修改版本的工作。在将此标记为解决方案之前,请您先编辑您的答案吗? –
实际上这条线是不受欢迎的,并且刚刚从以前的版本悬挂。我现在删除它, – jsbueno
你是什么意思“添加变量到另一个路线的回应”。你是说用新变量渲染模板? –