gpt4 book ai didi

python - flask -- 如何绕过 app.route/app.add_view_rule 不适用于闭包的限制?

转载 作者:太空宇宙 更新时间:2023-11-04 09:12:06 25 4
gpt4 key购买 nike

显然,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 注册函数时指定一个端点 或确保每个函数都有一个唯一的 __name__(因为 Flask 实际上将路由存储在以 endpoint 为键的字典中,它从函数的 __name__ 派生如果没有提供其他)。否则,您的第二个 View 将覆盖您的第一个 View 。

可能想查看 Flask 的 class-based Views - 它们可以更轻松地构建您正在寻找的动态(尽管闭包和类非常相似 [因为两者都是穷人对另一个的替代品])。

关于python - flask -- 如何绕过 app.route/app.add_view_rule 不适用于闭包的限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13734197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com