web2py: как я могу выполнить код перед вызовом контроллеров? - PullRequest
3 голосов
/ 16 ноября 2009

В web2py, есть ли способ заставить кусок общего кода выполняться перед вызовом всех контроллеров?

Например, я хочу добавить код, который будет регистрировать IP-адреса клиентов в журнале запросов для включения анализа. Я мог бы просто сделать первую строку всех моих контроллеров чем-то вроде response = RequestBase(request), но мне любопытно узнать, если это проблема, которая уже была решена с помощью других механизмов.

Ответы [ 2 ]

3 голосов
/ 26 ноября 2009

Поместите код в файл модели, и он будет выполнен перед любыми контроллерами. Если вы хотите, чтобы код выполнялся только для конкретного контроллера, поместите его наверх контроллера перед любыми функциями.

3 голосов
/ 19 ноября 2009

Вы можете просто поместить свою часть кода регистрации в файл определения модели models/db.py или в свой контроллер controllers/default.py, например:

with open("mylog.log", "at") as f:
    f.write(repr(request))

def index():
    # index controller definition

# ... rest of the code

или, если вам нужно определить функции или классы:

# --------------------------
# Log part:
# --------------------------

def my_log(request):
    with open("mylog.log", "at") as f:
        f.write(repr(request))

my_log(request)

# --------------------------
# Controllers part:
# --------------------------

def index():
    # index controller definition

# ... rest of the code

Конечно, repr(request) - это не то, что вам нужно, но вы получаете идею: оттуда вы можете записывать любую информацию, которая вам нравится, до вызова контроллеров (они просто определены на данном этапе).

Сервер уже ведет журнал в корневом каталоге, в httpserver.log.

...