Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在运行时替换或修改Tornado处理程序?_Python_Tornado - Fatal编程技术网

Python 如何在运行时替换或修改Tornado处理程序?

Python 如何在运行时替换或修改Tornado处理程序?,python,tornado,Python,Tornado,我正在编写一个Jupyter服务器扩展,允许我编写一个tornado.web.RequestHandler类。我想修改应用程序初始化时使用的其中一个处理程序,特别是创建: 从RequestHandler对象,我可以访问使用的tornado.web.Application子类。是否有一个公共API来获取我可以修改的处理程序列表 具体来说,我希望更改创建tornado.web.RedirectHandler时使用的“url”参数。看起来没有一个用于此的api文档,所以我猜我必须完全替换处理程序。To

我正在编写一个Jupyter服务器扩展,允许我编写一个
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)]