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)
触发事件