每个页面请求都要调用的函数

时间:2012-03-02 18:59:20

标签: python turbogears2

我正在寻找一种在我的网站上记录用户活动的方法。 我有一个标准的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中,它只执行一次。

2 个答案:

答案 0 :(得分: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')
...

有没有办法将它用于整个控制器?喜欢用 控制器的“allow_only”代替每个方法的“@require”。

答案 1 :(得分:0)

要在控制器的每个方法之前和之后执行某些操作,您可以在控制器类中定义_before_after方法。

如果您需要在应用程序中的每个方法之前和之后执行它们,您可以在base_config.register_hook('before_render' function)内调用app_cfg.py来注册应用程序范围。