烧瓶 - 如何解决app.route / app.add_view_rule无法使用闭包的限制?

时间:2012-12-05 23:09:24

标签: python flask

显然,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实际创建两个函数吗?

1 个答案:

答案 0 :(得分: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)

编辑:此外,您需要确保每次使用add_url_rule注册函数时指定endpoint或确保每个函数都具有唯一性__name__(因为Flask实际上将路由存储在endpoint上的字典中,如果没有提供其他字典,它将从函数的__name__派生出来。否则,您的第二个视图将覆盖您的第一个视图。

可能想要查看Flask的class-based Views - 它们可能会更容易构建您正在寻找的动态(虽然闭包和类非常相似[因为两者都是穷人替代另一个人。)。