当一个方法被暴露时,它可以返回一个模板使用的字典:
class RootController(TGController):
@expose('myapp.templates.index')
def index(self):
self.mykey = "foo"
self.mymenu = ["item1", "item2", "item3"]
self.selected = "item1"
return dict( mykey=self.mykey, mymenu=self.mymenu, selected=self.selected)
这段代码工作正常。现在我想将菜单样板封装成这样的装饰器:
class RootController(TGController):
@expose('myapp.templates.index')
@menu()
def index(self):
self.mykey = "foo"
self.mymenu = ["item1", "item2", "item3"]
self.selected = "item1"
return dict( mykey=self.mykey)
但我不知道如何编写这个菜单装饰器。如果我使用:
def before_render_cb(remainder, params, output):
return output.update( dict(mymenu=["item1", "item2", "item3"], selected="item1"))
class RootController(TGController):
@expose('myapp.templates.index')
@before_render(before_render_cb)
def index(self):
self.mykey = "foo"
self.mymenu = ["item1", "item2", "item3"]
self.selected = "item1"
return dict( mykey=self.mykey)
它将添加 mymenu 并选择到 dict 但我无权访问控制器的实例属性(self.mymenu 和 self.selected)
如果我使用装饰器:
class menus(object):
def __call__(self, func):
deco = Decoration.get_decoration(func)
return func
我可以访问装饰,但不能访问控制器也不能访问对象。
我怎样才能做到这一点?