2011-12-01 206 views
1

在Tornado中,您可以將Regexes鏈接到RequestHandlers。來自正則表達式的匹配組作爲參數傳遞給RequestHandler的get()或post()方法。獲取Tornado URL的匹配組

問題是,我想在調用get()或post()之前讀取這些匹配組的值。 Tornado有沒有辦法在get()或post()之外訪問這些匹配的組?我想要一些類似於RequestHandler.arguments的東西。

+0

什麼訪問request.arguments [製備](http://www.tornadoweb.org/documentation/web.html?highlight=prepare#tornado.web.RequestHandler.prepare)。這是通常GET/POST參數驗證的地方。 – lbolla

+0

我不想要求參數。我需要URL參數。例如,如果我的網址是「/ page /(\ d +)」,我想要數字(\ d +)。 – Mark

回答

3

不幸的是,似乎沒有辦法從「prepare」訪問url正則表達式匹配。

查看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()