0

自分のサイトでのユーザーアクティビティをログに記録する方法を探しています。標準のTG2クイックスタートプロジェクトがあります。モデルの「User」クラスに追加の列があります。

class User(DeclarativeBase):
...
    last_activity = Column(DateTime)
...

...そして私は機能を持っています:

def update_activity():
    if 'REMOTE_USER' in request.environ:
        auser = DBSession.query( User ).filter( User.user_name==request.environ['REMOTE_USER'] ).one()
        auser.last_activity = datetime.now()

この関数をどこに配置すればよいかわかりません。サーバーの任意のページにアクセスするたびに呼び出す必要があります。RootController内では、一度だけ実行されます。

4

2 に答える 2

0

これが私がデコレータを使って見つけた解決策です。

...
from tg.decorators import before_call
...
def updateactivity(*l, **kw):
    now = datetime.now()
    DBSession.query( User ).filter( User.user_name==request.environ['REMOTE_USER']).one().last_activity = datetime(now.year, now.month, now.day, now.hour, now.minute, now.second)
...
class RootController(BaseController):
...
    @expose('myproject.templates.mytemplate')
    @require(predicates.not_anonymous)
    @before_call(updateactivity)
    def mymethod(self, **kw):
...
        return dict(page='mypage')
...

コントローラ全体に使用する方法はありますか?各メソッドの「@require」の代わりに、コントローラーに「allow_only」を使用するのと同じです。

于 2012-03-03T10:56:31.670 に答える
0

コントローラのすべてのメソッドの前後にいくつかのアクションを実行するために、コントローラクラス内_beforeでメソッドを定義できます。_after

アプリケーションのすべてのメソッドの前後にそれらを実行する必要がある場合は、base_config.register_hook('before_render' function)内部を呼び出しapp_cfg.pyてアプリケーション全体のフックを登録できます。

于 2012-03-14T21:54:37.883 に答える