Как заменить или изменить Tornado Handler во время выполнения? - PullRequest
0 голосов
/ 28 июня 2018

Я пишу расширение сервера Jupyter, позволяющее мне написать класс tornado.web.RequestHandler. Я хотел бы изменить один из обработчиков, с которыми было инициализировано приложение, в частности тот, который создает перенаправление по умолчанию :

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

Из объекта RequestHandler у меня есть доступ к используемому подклассу tornado.web.Application. Есть ли публичный API для получения списка обработчиков, которые я мог бы изменить?

В частности, я хочу изменить параметр 'url', с которым создается tornado.web.RedirectHandler. Не похоже, что для этого есть документированный API, так что я предполагаю, что мне придется полностью заменить обработчик.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Любой экземпляр 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)]

Может быть, это то, что вы хотите.

0 голосов
/ 29 июня 2018

Tornado не поддерживает изменение обработчиков во время выполнения. Вместо этого создайте свой собственный обработчик, который выполняет желаемое перенаправление на основе любых критериев, которые вы хотите:

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