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