2012-02-02 1 views
0

, 그것은 템플릿을 사용하는 딕셔너리를 반환 할 수 있습니다TurboGears2의 데코레이터로 템플릿에 사용되는 dict에 vars를 삽입하는 방법은 무엇입니까? 메소드가 노출되면

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 

내가 장식에 액세스 할 수 있지만 내가 어떻게 할 수있는 노출 객체도 컨트롤러

할 수 있습니까? , 장식 도청 데이터를 전송

#---=== read this section second: ===--- 

def make_menu_from_controller(remainder, params, output): 
    controller = output.pop('controller') #Here we remove RootController sent by "index" and write it to "controller" variable. 
              #Only {'page':'index'} left inside "output" variable 
    return output.update(dict(mykey=controller.mykey, mymenu=controller.mymenu, selected=controller.selected)) #here we update dict adding "mykey", "mymenu" and "selected" keys. 

#---=== read this section first: ===--- 

class RootController(TGController): 

    def __init__(self): #here we initiate variables, which are not changed during surfing 
     self.mykey = "foo" 
     self.mymenu = ["item1", "item2", "item3"] 

    @expose('myapp.templates.index') 
    @before_render(make_menu_from_controller) 
    def index(self): 
     self.selected = "item1" 
     return dict(page='index', controller=self) #RootController sends itself 

당신이 볼 수 있듯이, "before_render"그것은 작동합니다 : 당신의 도움이

로랑 여기

답변

0

에 미리 덕분에 장식 "before_render"이해 내 예입니다 다른 데이터를 반환합니다. "output"은 "before_render"에 대한 로컬 변수입니다. 우리는 일관성을 변경하고 업데이트 한 다음이를 새로운 데이터로 보냈습니다.

1

당신은 항상 컨트롤러 객체와이는 @before_render 장식에서 컨트롤러 변수에 액세스 할 수 있도록해야한다

tg.request.controller_state.controllertg.request.controller_state.method를 사용하여 현재 요청을 처리하는 방법에 액세스 할 수 있습니다.

컨트롤러 개체 내부의 변수 설정은 여러 스레드간에 공유되므로 권장하지 않습니다. 권장되는 방법은 tg.tmpl_context을 사용하여 요청에 따라 임시 변수를 저장하는 것입니다.

tgext.menu을보고 응용 프로그램 메뉴를 생성하는 데 관심이 있으실 수 있습니다.