- TurboGears 教程
- TurboGears - 首页
- TurboGears - 概述
- TurboGears - 环境
- TurboGears - 第一个程序
- TurboGears - 依赖项
- TurboGears - 服务模板
- TurboGears - HTTP 方法
- Genshi 模板语言
- TurboGears - 包含
- TurboGears - JSON 渲染
- TurboGears - URL 层次结构
- TurboGears - Toscawidgets 表单
- TurboGears - 验证
- TurboGears - 闪存消息
- TurboGears - Cookie 和会话
- TurboGears - 缓存
- TurboGears - SQLAlchemy
- TurboGears - 创建模型
- TurboGears - CRUD 操作
- TurboGears - 数据表格
- TurboGears - 分页
- TurboGears - 管理员访问
- 授权与身份验证
- TurboGears - 使用 MongoDB
- TurboGears - 脚手架
- TurboGears - 钩子
- TurboGears - 编写扩展
- TurboGears - 可插拔应用程序
- TurboGears - RESTful 应用程序
- TurboGears - 部署
- TurboGears 有用资源
- TurboGears - 快速指南
- TurboGears - 有用资源
- TurboGears - 讨论
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'}