веб2пи:Как я могу выполнить код перед вызовом контроллеров?
-
20-09-2019 - |
Вопрос
Есть ли в web2py способ выполнить часть общего кода до вызова всех контроллеров?
Например, я хочу добавить код, который будет регистрировать IP-адреса клиентов в журнале запросов для включения анализа.Я мог бы просто сделать первую строку всех моих контроллеров примерно такой: response = RequestBase(request)
но мне любопытно узнать, была ли эта проблема уже решена с помощью каких-либо других механизмов.
Решение
Вы можете просто поместить свой фрагмент кода регистрации в файл определения модели, 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
.
Другие советы
Поместите код в файл модели, и он будет выполнен раньше всех контроллеров.Если вы хотите, чтобы код выполнялся только для определенного контроллера, поместите его в верхней части контроллера перед любыми функциями.