web2py:如何在调用控制器之前执行代码?

时间:2009-11-16 02:28:17

标签: model-view-controller controller modularity web2py

在web2py中,有没有办法在调用所有控制器之前执行一段公共代码?

例如,我想添加一些代码,将客户端IP记录到请求日志中以启用分析。我可以简单地将所有控制器的第一行设为response = RequestBase(request),但我很想知道这是否是一个已经通过其他机制解决的问题。

2 个答案:

答案 0 :(得分:3)

您可以简单地将您的日志记录代码放在模型定义文件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中的根目录中维护一个日志。

答案 1 :(得分:3)

将代码放在模型文件中,它将在任何控制器之前执行。如果您只想为特定控制器执行代码,请在任何函数之前将其放在控制器的顶部。