簡體   English   中英

flask —如何解決app.route / app.add_view_rule不適用於閉包的限制?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM