显然,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实际上创建两个函数吗?
您实际上并没有在代码中创建可保留值的闭包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 基于类的视图 -它们可以使构建所需动态变得更容易(尽管闭包和类非常相似[因为两者都是穷人的替代品])。
归档时间: |
|
查看次数: |
900 次 |
最近记录: |