0

メソッドが公開されると、テンプレートで使用されるdictを返すことができます。

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

デコレーションにはアクセスできますが、露出オブジェクトにもコントローラーにもアクセスできません。

これどうやってするの?

4

2 に答える 2

1

tg.request.controller_state.controllerと を使用して、現在のリクエストを処理しているコントローラ オブジェクトとメソッドにいつでもアクセスできます。tg.request.controller_state.method

@before_renderこれにより、デコレーターからコントローラー変数にアクセスできるようになります。

複数のスレッド間で共有されるため、コントローラー オブジェクト内で変数を設定することは推奨されないことに注意してください。推奨される方法tg.tmpl_contextは、リクエスト固有の一時変数を格納するために使用することです。

また、 tgext.menuを見てアプリケーション メニューを生成することにも興味があるかもしれません。

于 2012-03-14T22:02:19.323 に答える
0

「before_render」デコレーターを理解するための私の例を次に示します。

#---=== 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」デコレータは送信されたデータをインターセプトし、それを処理して別のデータを返します。「output」は「before_render」のローカル変数です。その整合性を変更して更新し、新しいデータとして送信しました。

于 2012-03-03T12:35:52.803 に答える