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'}