假设我有这样的路线,将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)
答案 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;是一个更聪明的对象,你可以根据需要插入更多的东西。