2012-03-02 42 views
0

我正在寻找一种方法在我的网站上记录用户活动。 我有一个标准的TG2快速启动项目。在我的模型 “用户”类有附加列:要调用每个页面请求的函数

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内部,它只执行一次。

回答

0

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

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

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”。

相关问题