import importlib DEFAULT_SETTINGS = { "packageNames": [ "framework.module.Interceptor", ] } class InterceptorChain(object): _interceptors = [] def __init__(self, packageNames = None): if packageNames is None: self.packageNames = DEFAULT_SETTINGS.get("packageNames") else: self.packageNames = packageNames def doFefore(self, request): for interceptor in self._interceptors: interceptor().process_request(request) def addInterceptor(self, interceptor): self._interceptors.append(interceptor) def loaderPlugin(self): for packageName in self.packageNames: methodName = packageName[packageName.rindex(".") + 1:] moduleName = packageName[:packageName.rindex(".")] try: module = importlib.import_module(moduleName) if hasattr(module, methodName): clazz = getattr(module, methodName) self._interceptors.append(clazz) except ImportError as e: print(e) def doAfter(self, request, response): size = len(self._interceptors) - 1 while size >= 0: self._interceptors[size]().process_response(request, response) size -= 1 def process(self, func, req): self.loaderPlugin() self.doFefore(req) if callable(func): resp = func(req) self.doAfter(req, resp) return resp raise TypeError("func is not a callable obj") def index(request): return "req" chain = InterceptorChain() print(chain.process(index, "name"))
2、拦截对象
class Interceptor(object): def process_request(self, request): print(request + " req") def process_response(self,request, response): return response + " Interceptor"