You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:09:33