2016-02-19 57 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