3

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

4

1 回答 1

6

您实际上并没有在代码中创建一个保留以下的闭包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 的基于类的视图- 它们可能更容易构建您正在寻找的动态(尽管闭包和类非常相似 [因为两者都是穷人的替代品])。

于 2012-12-05T23:19:54.970 回答