TurboGears – Hooks 钩子
TurboGears 中有三种方法可以将行为插入现有应用程序。
Hook − 这是一种可以定义事件并在事件发出时通知已注册侦听器的机制。
控制器包装器 − 它位于 TurboGears 和控制器之间,因此可以像装饰器一样扩展控制器。因此,它可以附加到任何第三方控制器应用程序。
应用程序包装器 −它类似于任何 WSGI 中间件,但仅在 TurboGears 上下文中工作。
在本章中,我们将讨论如何在现有应用程序内使用钩子。
钩子
钩子是在应用程序的配置文件 app_cfg.py 中注册的事件。然后,任何控制器都通过事件装饰器挂接到这些事件上。
以下钩子在 TurboGears 中定义 −
Sr.No. | 钩子 &描述 |
---|---|
1 | Startup() 仅限应用程序范围,在应用程序启动时调用。 |
2 | shutdown() 仅限应用程序范围,在应用程序退出时调用。 |
3 | configure_new_app 新应用程序由应用程序配置器创建。 |
4 | before_config(app) 仅限应用程序范围,在创建后立即调用应用程序,但在设置选项和中间件之前 |
5 | after_config(app) 仅限应用程序范围,在完成所有设置后调用。 |
6 | before_validate 在执行验证之前调用 |
7 | before_call 在验证之后调用,在调用实际控制器方法之前。 |
8 | before_render 在渲染控制器模板之前调用,输出为控制器返回值。 |
9 | after_render 在完成渲染控制器模板后调用。 |
注册一个钩子
为了注册一个钩子,请在app_cfg.py中创建函数,然后使用以下代码注册它们 −
tg.hooks.register(hookane, function, controller)
在下面的代码中,on_startup、on_shutdown 和 before_render 钩子是在 app_cfg.py 中注册。
def on_startup(): print 'hello, startup world' def on_shutdown(): print 'hello, shutdown world' def before_render(remainder, params, output): print 'system wide before render' # ... (base_config init code) tg.hooks.register('startup', on_startup) tg.hooks.register('shutdown', on_shutdown) tg.hooks.register('before_render', before_render)
before_render 钩子已在 Rootcontroller 中的控制器函数中注册。在 controllers oot.py 中添加以下代码。
from tg.decorators import before_render class RootController(BaseController): @expose('hello.templates.index') @before_render(before_render_cb) def index(self, *args, **kw): return dict(page = 'index')
当应用程序启动时,控制台中会显示启动消息。
你好,启动世界 在 http://127.0.0.1:8080 上启动标准 HTTP 服务器
当在浏览器中输入"/"URL 时,控制台上会显示与 before_render 钩子相对应的消息。
system wide before render Going to render {'page': 'index'}