【问题标题】:How does python bottle framework install routing handler through decorator?python Bottle框架如何通过装饰器安装路由处理程序?
【发布时间】:2015-03-03 00:21:52
【问题描述】:

在python Bottle框架下安装路由处理程序的示例如下:

from bottle import Bottle, run
app = Bottle()

@app.route('/hello')
def hello():
    return "Hello World!"

run(app, host='localhost', port=8080)

上面的代码会将“localhost:8080/hello”路由到显示“Hello World!”的页面(由函数 hello 处理)。 我想知道这个安装过程是如何完成的? 框架如何知道函数“hello”使用“app.route”作为其装饰器,从而将传入请求分派给该函数?

【问题讨论】:

  • 你似乎不知道装饰器是如何工作的。 “框架如何知道函数“hello”使用“app.route”作为它的装饰器”——仅仅因为装饰器是用函数作为参数调用的,因此它可以存储、访问它,甚至修改它,等等。我建议在询问任何其他与装饰器相关的问题之前阅读官方装饰器教程。
  • 也许我的例子或我的陈述不是很好,但我的观点是框架如何找到那些使用特定装饰器安装的功能。
  • 一开始我以为python装饰器有什么奇怪的功能可以从装饰器中找到“已安装的功能”。但是通过@vaultah 的解决方案,我看到它只是使用某种方式来解析所有函数签名以找到它们。
  • 好吧,正如我所说,阅读装饰器教程应该可以消除这种困惑。此外,对于大多数 python 库(阅读:除了用 C 编写的库之外的所有库),您只需浏览源代码并准确了解它们在做什么。不,它不会“解析函数签名”,它只是存储对实际函数的引用,因为 python 中的函数只是另一个对象。
  • 所以@l4mpi 你的意思是处理安装路由的代码不在yieldroutes中?

标签: python url-routing wsgi bottle


【解决方案1】:

函数的名称对 Bottle 没有任何意义,只要您提供一个或多个路径到 route 装饰器。

Route 的构造函数的参数包括callbackrule,其中callback 是您的函数,rule 是路径字符串。

如果提供了一个或多个路径,Bottle 将为每个路径创建一个 Route 实例。

函数名称only 起作用,如果您不提供route 的单一路径。然后,Bottle 将从函数的签名中生成可能的路径(参见 source 中的 yieldroutes)并为每个路径创建一个 Route 实例。

来自Bottle.route's source的相关部分:

for rule in makelist(path) or yieldroutes(callback):
    for verb in makelist(method):
        verb = verb.upper()
        route = Route(self, rule, verb, callback, name=name,
                      plugins=plugins, skiplist=skiplist, **config)
        self.add_route(route)

【讨论】:

  • 是的,感谢您的帮助。一开始,我以为安装路由代码在 wsgiref 模块中。现在,我可以进一步追踪 yieldroutes 是如何工作的。
猜你喜欢
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2014-08-03
  • 2013-11-17
  • 2012-11-01
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多