Python Tornado:如何继承Handler并修改module变量?
当然可以实现!而且有几种优雅的方式,完全不用重写那100行的get方法,我给你拆解一下:
方案一:重构基类,封装module提取逻辑(首推)
最稳妥的做法是先给基类做个小重构——把获取module的逻辑单独抽成一个私有方法,这样子类只需要重写这个小方法就行,核心的100行代码完全保留。
修改后的基类代码:
class BaseHandler(RequestHandler): def _get_module(self): # 把原来的module提取逻辑单独封装 return self.request.uri.split('/')[1].split('?')[0] def get(self, id=None, *args, **kwargs): # 现在调用封装好的方法获取module module = self._get_module() # 后面原来的100行业务逻辑保持不变...
然后你的子类只需要重写_get_module方法,自定义module的值:
class CustomHandler(BaseHandler): def _get_module(self): # 这里写你想要的module获取规则,比如固定值或者其他解析逻辑 return "my_target_module"
这样当子类调用get方法时,会自动使用你重写后的module值,基类的100行核心逻辑完全复用,既简洁又安全。
方案二:不修改基类的拦截方式(适合基类不可修改的场景)
如果基类是第三方库或者你无权修改的代码,也可以用“hack”一点的方式,在子类中先修改请求的uri,再调用父类的get方法:
class CustomHandler(BaseHandler): def get(self, id=None, *args, **kwargs): # 先保存原始uri,避免影响后续逻辑 original_uri = self.request.uri # 构造新的uri,让基类的module提取逻辑得到我们想要的值 # 这里的逻辑可以根据你的需求调整,比如直接替换第一个路径段 path_part = self.request.uri.split('?')[0] query_part = f"?{self.request.uri.split('?')[1]}" if '?' in self.request.uri else "" self.request.uri = "/my_target_module" + path_part.split('/', 1)[1] + query_part try: # 调用父类的get方法,此时基类计算的module就是我们修改后的 super().get(id, *args, **kwargs) finally: # 恢复原始uri,防止影响其他请求处理 self.request.uri = original_uri
不过这种方式要注意副作用,比如如果基类的其他逻辑也依赖uri的话,可能会出问题,所以优先推荐第一种重构方案。
内容的提问来源于stack exchange,提问作者ehsan shirzadi
相关产品推荐
相关产品推荐

