TurboGears – 钩子



在 TurboGears 中,有三种方法可以将行为插入现有应用程序。

  • 钩子 (Hook) − 这是一种机制,可以通过它定义事件,并在发出事件时通知已注册的监听器。

  • 控制器包装器 (Controller Wrapper) − 它位于 TurboGears 和控制器之间,因此可以像装饰器一样扩展控制器。因此,它可以附加到任何第三方控制器应用程序。

  • 应用程序包装器 (Application Wrapper) − 它类似于任何 WSGI 中间件,但仅在 TurboGears 上下文中工作。

本章将讨论如何在现有应用程序中使用钩子。

钩子

钩子是在应用程序的配置文件 app_cfg.py 中注册的事件。然后,任何控制器都通过事件装饰器连接到这些事件。

TurboGears 中定义了以下钩子:

序号 钩子及描述
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\root.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')

当应用程序启动时,启动消息将显示在控制台中。

hello, startup world
Starting Standard HTTP server on http://127.0.0.1:8080

当在浏览器中输入“/”URL 时,与 before_render 钩子对应的消息将显示在控制台中。

system wide before render
Going to render {'page': 'index'}
广告