如何在运行时替换或修改龙卷风处理器?

时间:2018-06-28 00:28:54

标签: python tornado

我正在编写一个Jupyter服务器扩展,允许我编写一个tornado.web.RequestHandler类。我想修改应用程序初始化时使用的其中一个处理程序,特别是创建default redirect的处理程序:

(r'/?', web.RedirectHandler, {
    'url' : settings['default_url'],
    'permanent': False, # want 302, not 301
})

RequestHandler对象可以访问所使用的tornado.web.Application子类。是否有公共API获取可以修改的处理程序列表?

具体来说,我想更改用于创建tornado.web.RedirectHandler的'url'参数。似乎没有针对此的文档化api,因此我想我将不得不完全替换该处理程序。

2 个答案:

答案 0 :(得分:1)

Tornado不支持在运行时更改处理程序。相反,请创建您自己的处理程序,该处理程序将根据您想要的条件进行所需的重定向:

class MyRedirectHandler(RequestHandler):
    def get(self):
        self.redirect(self.settings['default_url'], permanent=False)

答案 1 :(得分:0)

tornado.web.Application的任何实例都有default_router

>>> import tornado.web
>>> import tornado.routing
>>> r1 = tornado.routing.Rule(r'/', MainHandler, name="/")
>>> r2 = tornado.routing.Rule(r'/sub/[\w-]+/', SubHandler, name="/sub/{name of}")
>>> app_tornado = tornado.web.Application([r1, r2])
>>> app_tornado.default_router.rules
[Rule(<tornado.routing.AnyMatches object at 0x7f603cadd0b8>, <tornado.web._ApplicationRouter object at 0x7f603cadd080>, kwargs={}, name=None)]
>>> app_tornado.default_router.rules[0].target.rules
[Rule('/', <class '__main__.MainHandler'>, kwargs={}, name='/'), Rule('/sub/[\\w-]+/', <class '__main__.SubHandler'>, kwargs={}, name='/sub/{name of}')]

因此,您可以添加规则:

>>> app_tornado.default_router.rules[0].target.add_rules([('/new_rule/', MainHandler)])
>>> app_tornado.default_router.rules[0].target.rules
[Rule('/', <class '__main__.MainHandler'>, kwargs={}, name='/'), Rule('/sub/[\\w-]+/', <class '__main__.SubHandler'>, kwargs={}, name='/sub/{name of}'), Rule(<tornado.routing.PathMatches object at 0x7f603cadd1d0>, <class '__main__.MainHandler'>, kwargs={}, name=None)]

可能就是您想要的。