[英]flask — how to get around limitation that app.route / app.add_view_rule doesn't work with closures?
顯然,Flask的app.route
/ app.add_url_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實際上創建兩個函數嗎?
您實際上尚未在代碼中創建保留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)
編輯:此外,您需要確保每次使用add_url_rule
注冊功能時,要么指定一個endpoint
要么確保每個功能具有唯一的__name__
(因為Flask實際上將路由存儲在endpoint
上鍵入的字典中, (如果未提供其他函數, __name__
函數的__name__
派生)。 否則,您的第二個視圖將覆蓋您的第一個視圖。
您可能需要研究Flask 基於類的視圖 -它們可能使構建所需的動態更加容易(盡管閉包和類非常相似[因為兩者都是窮人的替代品])。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.