Python中Sinatra风格URL路由的Ruby块等价物
有没有办法在Python中重新实现Sinatra的URL路由功能?这样做有没有什么不好的地方?
来自Sinatra的示例:
get '/' do
'Hello world!'
end
来自Flask(使用装饰器进行路由)的示例:
@app.route("/")
def hello():
return "Hello World!"
Sinatra通过Ruby的块来实现这种简洁性:
def get(path, opts={}, &block)
conditions = @conditions.dup
route('GET', path, opts, &block)
@conditions = conditions
route('HEAD', path, opts, &block)
end
我了解到Python没有完全相同的Ruby块,但有其他方法可以实现类似的功能。这该怎么做呢?
3 个回答
0
关于你第二个问题“有没有什么原因让这样做不太好?”
- 有了命名函数,我们可以使用
url_for(some_function)
这样的方式,这样可以方便地调整网站结构。 - 命名函数还可以进行测试、添加文档说明等。
0
另一种方法是使用元类,就像在 webpy 的 web.autoapplication 中那样,这是相关的源代码。
3
正如你所说,Python没有像Ruby那样的块(blocks)功能。装饰器(decorators)是常用的解决方案,用来处理路由(routing)。另外一种方法是创建一个包含路由的列表或字典,但因为你似乎想把路由的定义放在代码旁边,所以使用装饰器的方法是最合适的选择。