2012-12-05 20 views
1

顯然,Flask的app.route/app.add_url_rule不適用於關閉。例如,創建一個基本的應用程序,瓶 - 如何解決app.route/app.add_view_rule無法用於關閉的限制?

for name in ('/hi', '/bye'): 
    app.add_url_rule(name, view_func=lambda: name) 

和查詢它,

dev:~/pg/yelp-main> curl localhost:9113/hi 
/bye 

表明,它不封閉工作。解決此問題的最簡單方法是什麼?我可以強制Python實際創建兩個函數嗎?

回答

4

你還沒有真正建立在你的代碼封閉,保留name值:

view_func=lambda: name # <- points at the *symbol*, which holds the *last* value 
# in the case of a loop 

您需要將值傳遞到封閉保存

view_maker = lambda name: (lambda: name) for name in ('/hi', '/bye'): endpoint = name.replace("/", "") app.add_url_rule(name, view_func=view_maker(name), endpoint=endpoint) 

編輯:此外,您需要確保每次使用註冊函數時您可以指定一個endpoint或確保每個函數都有唯一的__name__(因爲Flask實際上將路由存儲在鍵入endpoint的字典中,如果沒有提供其他函數,它將從函數的__name__派生出來)。否則,你的第二個視圖會覆蓋你的第一個視圖。

可能想看看瓶的class-based Views - 他們可能更容易建立你正在尋找的動力學(儘管關閉和類很相似[在兩者都是可憐的人對其他替代]) 。

+0

嗯,顯然不是 - 您可以輕鬆創建腳手架來自己測試[http://pastebin.com/6Zt1iCGs]。當給出URI「/ hi」時,這仍然響應「/ bye」。我通過使用request.uri解決了這個問題,但它感覺有點難看。 – gatoatigrado

+0

並不意味着無禮......意思是添加「謝謝,但是」:) – gatoatigrado

+0

*笑* @ gatoatigrado - 沒有冒犯的意思,沒有采取!我更新了我的答案(閉包*不工作,但Flask覆蓋存儲在'url_mapper'中的函數,因爲這兩個函數具有相同的'__name__')。新版本的作品:-) –