Python中Sinatra风格URL路由的Ruby块等价物

2 投票
3 回答
793 浏览
提问于 2025-04-16 12:22

有没有办法在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)。另外一种方法是创建一个包含路由的列表或字典,但因为你似乎想把路由的定义放在代码旁边,所以使用装饰器的方法是最合适的选择。

撰写回答