flask-如何解决app.route / app.add_view_rule无法与闭包一起使用的限制?

gat*_*ado 1 python flask

显然,Flask的app.route/ app.add_url_rule不适用于闭包。例如,使用创建一个基本应用,

for name in ('/hi', '/bye'):
    app.add_url_rule(name, view_func=lambda: name)
Run Code Online (Sandbox Code Playgroud)

并查询它

dev:~/pg/yelp-main> curl localhost:9113/hi
/bye
Run Code Online (Sandbox Code Playgroud)

表明它不适用于闭包。解决此问题的最简单方法是什么?我可以强制Python实际上创建两个函数吗?

Sea*_*ira 5

您实际上并没有在代码中创建可保留的闭包name

view_func=lambda: name  # <- points at the *symbol*, which holds the *last* value
# in the case of a loop
Run Code Online (Sandbox Code Playgroud)

要保留该值,您需要将该值传递给闭包:

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)
Run Code Online (Sandbox Code Playgroud)

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

可能需要研究Flask 基于类的视图 -它们可以使构建所需动态变得更容易(尽管闭包和类非常相似[因为两者都是穷人的替代品])。