TurboGears - ตะขอ
TurboGears มีสามวิธีในการเชื่อมต่อพฤติกรรมภายในแอปพลิเคชันที่มีอยู่
Hook - เป็นกลไกที่สามารถกำหนดเหตุการณ์และแจ้งให้ผู้ฟังที่ลงทะเบียนทราบว่ามีการเผยแพร่เหตุการณ์เมื่อใด
Controller Wrapper- อยู่ระหว่าง TurboGears และ Controller เพื่อให้สามารถขยายคอนโทรลเลอร์ได้เหมือนมัณฑนากร ดังนั้นจึงสามารถเชื่อมต่อกับแอปพลิเคชันคอนโทรลเลอร์ของ บริษัท อื่นได้
Application Wrapper - คล้ายกับมิดเดิลแวร์ WSGI แต่ทำงานในบริบท TurboGears เท่านั้น
ในบทนี้เราจะพูดถึงวิธีการใช้ตะขอภายในแอปพลิเคชันที่มีอยู่
ตะขอ
Hooks คือเหตุการณ์ที่ลงทะเบียนในไฟล์คอนฟิกูเรชันของแอปพลิเคชัน 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 เรียกว่าหลังจากเสร็จสิ้นการเรนเดอร์เทมเพลตคอนโทรลเลอร์ |
ลงทะเบียน Hook
เพื่อที่จะ register a Hook, สร้างฟังก์ชันใน app_cfg.py จากนั้นลงทะเบียนโดยใช้รหัสต่อไปนี้ -
tg.hooks.register(hookane, function, controller)
ในโค้ดต่อไปนี้ on_startup, on_shutdown และ before_render hooks จะถูกลงทะเบียนใน 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 hook ถูกลงทะเบียนด้วยฟังก์ชันคอนโทรลเลอร์ใน 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 hook จะแสดงบนคอนโซล
system wide before render
Going to render {'page': 'index'}