bricks
开发指南
2.1 事件
2.1.4 插槽拓展

Bricks 虽然内置了众多的事件插槽, 但是为了适应开发者的各种五花八门的需求, 还预留了事件插槽拓展语法. 拓展语法也很简单, 仅需在自己的代码类下面编写特定的函数即可, 事件插槽便能够自动注册! 函数名的命名规则为 _when_xxx 函数参数为 method,为原本的的函数引用 函数体请在做响应处理之后,返回新的函数引用,类似装饰器的写法 ​

动态插槽的原理为使用装饰器包装原函数, 这与此基类有关, 基类的原类会自动监测拦截器, 对函数进行包装修改, 如 before request + after request 及使用的此语法进行的拓展, 源码如下:

def _when_on_request(self, raw_method):  # noqa  
    @functools.wraps(raw_method)  
    def wrapper(context: Context, *args, **kwargs):  
        context.form = state.const.BEFORE_REQUEST  
        events.EventManager.invoke(context)  
        context.form = state.const.ON_REQUEST  
        self.number_of_total_requests.increment()  
        pandora.invoke(  
            func=raw_method,  
            args=args,  
            kwargs=kwargs,  
            annotations={  
                self.Context: context,  
                Item: context.seeds,  
                Request: context.request,  
            },  
            namespace={  
                "context": context,  
                "seeds": context.seeds,  
                "request": context.request  
            }  
        )  
        context.form = state.const.AFTER_REQUEST  
        events.EventManager.invoke(context)  
  
    return wrapper
 
 

在该函数中,先使用 context.form = state.const.BEFORE_REQUEST 指定当前事件类型,然后使用 events.EventManager.invoke(context) 触发事件