显然,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实际创建两个函数吗?
答案 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 - 它们可能会更容易构建您正在寻找的动态(虽然闭包和类非常相似[因为两者都是穷人替代另一个人。)。