找到与mvc filter/interceptor类似的机制:tween
自定义的tween可以被config.add_tween()加入到配置中,从而对request-response处理过程前后加入自己对request和response的处理逻辑;例如,如下是记录每一个请求处理过程消耗时间的一个tween:
def timing_tween_factory(handler, registry):
if asbool(registry.settings.get('do_timing')):
# if timing support is enabled, return a wrapper
def timing_tween(request):
start = time.time()
try:
response = handler(request)
finally:
end = time.time()
url = request.url
log.debug('The request [%s] took %s seconds' % (url,(end - start)) )
return response
return timing_tween
# if timing support is not enabled, return the original
# handler
return handler
在main()函数中,将以上的tween factory注册进来:
config.add_tween('.tweens.timing_tween_factory')
并在.ini文件中加入与代码中对应的配置项
[app:main]
...
do_timing = true
可以在main()中通过config.add_tween()注册多个tween factory,调用的顺序与注册代码顺序相反(压栈,先进后出),也可以通过此函数的两个kwargs(over=,under=)显性地对tween的执行顺序进行设置,显性设置后与代码顺序无关,其中over=是先于,under=是后于;比如:
config.add_tween('myapp.tween_factory1', over=pyramid.tweens.MAIN)
config.add_tween('myapp.tween_factory2', over=pyramid.tweens.MAIN, under='myapp.tween_factory1')
可以通过ptweens development.ini来查看执行tween链的执行顺序:
INGRESS (implicit)
pyramid.tweens.excview_tween_factory (implicit)
myapp.tween_factory1
myapp.tween_factory2
MAIN (implicit)
我想tween可以同mvc中的filter一样类似公共权限检测之类的事情;