获取Tornado URL的匹配组

1 投票
1 回答
2037 浏览
提问于 2025-04-17 07:26

在Tornado这个框架里,你可以把正则表达式(Regex)和请求处理器(RequestHandler)连接起来。当正则表达式匹配成功后,匹配到的内容会作为参数传递给请求处理器的get()或post()方法。

但是,我想在调用get()或post()之前就读取这些匹配到的内容。Tornado有没有办法在get()或post()之外访问这些匹配到的内容呢?我想要的功能类似于RequestHandler.arguments。

1 个回答

3

很遗憾,似乎没有办法从“prepare”中获取到网址的正则匹配结果。

查看一下 tornado/web.py 里的代码,特别是第949行,可以看到 prepare 根本没有传入任何参数。

我自己拼凑了一个解决方案,虽然能用,但并不可靠……下面就是这个方案。

import tornado.ioloop
import tornado.web
from tornado import escape

class MainHandler(tornado.web.RequestHandler):
    def prepare(self):
        # work out url regex match as in
        # tornado/web.py:1283
        handlers = self.application._get_host_handlers(self.request)
        for spec in handlers:
            match = spec.regex.match(self.request.path)
            def unquote(s):
                if s is None: return s
                return escape.url_unescape(s, encoding=None)
            args = [unquote(s) for s in match.groups()]
            # do something with args

    def get(self, who):
        self.write('hello ' + who)

if __name__ == "__main__":
    application = tornado.web.Application([
        (r"/(\w+)", MainHandler),
    ])
    application.listen(8999)
    tornado.ioloop.IOLoop.instance().start()

撰写回答