Python 如何在运行时替换或修改Tornado处理程序?
我正在编写一个Jupyter服务器扩展,允许我编写一个Python 如何在运行时替换或修改Tornado处理程序?,python,tornado,Python,Tornado,我正在编写一个Jupyter服务器扩展,允许我编写一个tornado.web.RequestHandler类。我想修改应用程序初始化时使用的其中一个处理程序,特别是创建: 从RequestHandler对象,我可以访问使用的tornado.web.Application子类。是否有一个公共API来获取我可以修改的处理程序列表 具体来说,我希望更改创建tornado.web.RedirectHandler时使用的“url”参数。看起来没有一个用于此的api文档,所以我猜我必须完全替换处理程序。To
tornado.web.RequestHandler
类。我想修改应用程序初始化时使用的其中一个处理程序,特别是创建:
从RequestHandler
对象,我可以访问使用的tornado.web.Application
子类。是否有一个公共API来获取我可以修改的处理程序列表
具体来说,我希望更改创建
tornado.web.RedirectHandler
时使用的“url”参数。看起来没有一个用于此的api文档,所以我猜我必须完全替换处理程序。Tornado不支持在运行时更改处理程序。相反,创建自己的处理程序,该处理程序根据您想要的任何条件执行所需的重定向:
class MyRedirectHandler(RequestHandler):
def get(self):
self.redirect(self.settings['default_url'], permanent=False)
tornado.web.Application
的任何实例都有默认路由器
:
>>> 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}')]
导入tornado.web
>>>导入tornado.routing
>>>r1=tornado.routing.Rule(r'/',MainHandler,name=“/”)
>>>r2=tornado.routing.Rule(r'/sub/[\w-]+/',SubHandler,name=“/sub/{name of}”)
>>>app\u tornado=tornado.web.Application([r1,r2])
>>>app\u tornado.default\u router.rules
[规则(,kwargs={},name=None)]
>>>app\u tornado.default\u router.rules[0].target.rules
[规则('/',kwargs={},name='/',规则('/sub/[\\w-]+/',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)]
>>app_tornado.default_router.rules[0]。target.add_rules([('/new_rule/',MainHandler)])
>>>app\u tornado.default\u router.rules[0].target.rules
[规则('/',kwargs={},name='/'),规则('/sub/[\\w-]+/',kwargs={},name='/sub/{name of}'),规则(,kwargs={},name=None)]
可能是您想要的。谢谢,但是这个处理程序是在我正在为其编写扩展的代码中创建的,所以我不能为该处理程序选择我自己的类。我仍然会接受答案(感谢您确认这是不可能的)。
>>> 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)]