拦截器

简介

可以给一类pattern或一个dealer设置拦截器(也就是interceptor或hook),就能在dealer处理请求的前后执行一些统一的操作,例如获取数据库连接等。

方法

任何dealer都可以作为拦截器使用,在dealer内部把Context对象当成函数调用,则返回值为被拦截的dealer的处理结果。

作为拦截器的dealer的参数依然能获得前端传入的参数。

给一类pattern设置拦截器

使用Application对象的add_interceptor(self, pattern, method, dealer)add_*_interceptor(self, pattern, dealer)方法,可以注册一个全局的拦截器,拦截器的包含顺序就是注册拦截器的先后顺序。

示例:

from lessweb import Application, Context

def hookA(ctx:Context):
    return '[%s]' % ctx()

def hookB(ctx:Context, a:str):
    assert a == 'A'
    return '(%s)' % ctx()

def controller(a:str):
    return a

app = Application()
app.add_get_interceptor('.*', dealer=hookA)
app.add_get_interceptor('.*', dealer=hookB)
app.add_get_mapping('/info', dealer=controller)
app.run()

请求: curl "http://localhost:8080/info?a=A"
返回: [(A)]

给一个dealer设置拦截器

使用@interceptor(dealer)修饰器,可以给一个dealer单独设置拦截器。使用多个修饰器时,包含顺序与修饰器顺序相同。

示例:

from lessweb import Application, Context, interceptor

def hookA(ctx:Context):
    return '[%s]' % ctx()

def hookB(ctx:Context, a:str):
    assert a == 'B'
    return '<%s>' % ctx()

@interceptor(hookA)
@interceptor(hookB)
def controller(a:str):
    return a

app = Application()
app.add_get_mapping('/info', dealer=controller)
app.run()

请求: curl "http://localhost:8080/info?a=B"
返回: [<B>]