TurboGears – 挂钩


TurboGears 中有三种方法可以将Behave插入现有应用程序中。

  • 钩子- 这是一种可以定义事件并在事件发出时通知注册侦听器的机制。

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

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

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

挂钩

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

TurboGears 中定义了以下钩子 -

先生。 挂钩和说明
1

启动()

仅限应用程序范围,在应用程序启动时调用。

2

关闭()

仅在应用程序范围内,在应用程序退出时调用。

3

配置新应用程序

新应用程序由应用程序配置器创建。

4

之前的配置(应用程序)

仅在应用程序范围内,在创建应用程序之后、设置选项和中间件之前立即调用

5

after_config(应用程序)

仅限应用程序范围,在完成所有设置后调用。

6

验证前

在执行验证之前调用

7

调用前

在验证之后、调用实际控制器方法之前调用。

8

渲染前

在渲染控制器模板之前调用,输出是控制器返回值。

9

渲染后

渲染完控制器模板后调用。

注册一个钩子

为了注册 Hook,请在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'}