4.1. 为 BaseController 增加 __before__ 方法

__before__ 是 WSGIController 特有的方法,在 Action 执行之前执行, 可以用于初始化变量,以及做权限控制。

BaseController 是所有控制器的基类,在该基类增加授权功能, 会自动为其他控制器所使用。BaseController 的代码在文件 lib/base.py 中。

class BaseController(WSGIController):
    requires_auth = []

    def __before__(self, action):
        if isinstance(self.requires_auth, bool) and not self.requires_auth:
            pass
        elif isinstance(self.requires_auth, (list, tuple)) and \
            not action in self.requires_auth:
            pass
        else:
            if 'user' not in session:
                session['path_before_login'] = request.path_info
                session.save()
                return redirect_to(h.url_for(controller='security'))

从BaseController 继承的类,可以设置 requires_auth 来增加授权。 requires_auth 可以为 True 或者是一个包含要进行授权的动作列表。如果需要授权, 会检查 session 中是否包含登录信息否则跳转到登录页面(security控制器)。