获取Tornado URL的匹配组
在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()