функция вызывается при каждом запросе страницы - PullRequest
0 голосов
/ 02 марта 2012

Я ищу способ регистрации активности пользователей на моем сайте.У меня есть стандартный проект быстрого запуска 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 он выполняется только один раз.

Ответы [ 2 ]

0 голосов
/ 15 марта 2012

Чтобы выполнить некоторые действия до и после каждого метода контроллера, вы можете определить _before и _after методы внутри класса контроллера.

Если вам нужно, чтобы они выполнялись до и после каждого метода в приложении, вы можете вызвать base_config.register_hook('before_render' function) внутри app_cfg.py, чтобы зарегистрировать перехват приложения.

0 голосов
/ 03 марта 2012

Вот решение, которое я нашел, используя декораторы.

...
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» для каждого метода.

...