如何在运行时替换或修改 Tornado 处理程序?
How to replace or modify a Tornado Handler at runtime?
我正在写一个Jupyter服务器扩展,允许我写一个tornado.web.RequestHandler
class。我想修改应用程序已初始化的处理程序之一,特别是创建 default redirect:
的处理程序
(r'/?', web.RedirectHandler, {
'url' : settings['default_url'],
'permanent': False, # want 302, not 301
})
我可以从 RequestHandler
对象访问所使用的 tornado.web.Application
subclass。是否有 public API 来获取我可以修改的处理程序列表?
具体来说,我希望更改创建 tornado.web.RedirectHandler
时使用的 'url' 参数。看起来没有关于此的记录 api,所以我猜我必须完全更换处理程序。
Tornado 不支持在运行时更改处理程序。相反,制作你自己的处理程序,它根据你想要的任何标准进行所需的重定向:
class MyRedirectHandler(RequestHandler):
def get(self):
self.redirect(self.settings['default_url'], permanent=False)
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)]
也许是你想要的。
我正在写一个Jupyter服务器扩展,允许我写一个tornado.web.RequestHandler
class。我想修改应用程序已初始化的处理程序之一,特别是创建 default redirect:
(r'/?', web.RedirectHandler, {
'url' : settings['default_url'],
'permanent': False, # want 302, not 301
})
我可以从 RequestHandler
对象访问所使用的 tornado.web.Application
subclass。是否有 public API 来获取我可以修改的处理程序列表?
具体来说,我希望更改创建 tornado.web.RedirectHandler
时使用的 'url' 参数。看起来没有关于此的记录 api,所以我猜我必须完全更换处理程序。
Tornado 不支持在运行时更改处理程序。相反,制作你自己的处理程序,它根据你想要的任何标准进行所需的重定向:
class MyRedirectHandler(RequestHandler):
def get(self):
self.redirect(self.settings['default_url'], permanent=False)
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)]
也许是你想要的。