2012-10-25 63 views
3

我有一個典型的WSGI應用程序,像這樣:在webapp2中,我如何獲得所有路由URI列表?

app = webapp2.WSGIApplication([ 
    ('/site/path/one',  'package.module.ClassOne'), 
    ('/site/path/two',  'package.module.ClassTwo'), 
    ('/site/path/three', 'package.module.ClassThree'), 
]) 

我希望以後能夠找回我的應用程序路由列表,例如說,在ClassOne:

class ClassOne(webapp2.RequestHandler): 
    def get(self): 
     print ''' list of routes (e.g. '/site/path/one', '/site/path/two', etc.) ''' 

回答

3

它看起來像WSGIApplication會具有router財產

Router

def __repr__(self): 
     routes = self.match_routes + [v for k, v in \ 
      self.build_routes.iteritems() if v not in self.match_routes] 

     return '<Router(%r)>' % routes 

你WSGIApplication實例表示是你webapp2.RequestHandler

的屬性,所以我認爲request.app.router

所以希望有一個更簡單明瞭的方式,但如果不是上面應該工作?

webapp2的提供了真正偉大的搜索源代碼在http://webapp2.readthedocs.io/en/latest/

1

我剛纔寫的函數提取約在webapp2的應用路由器所有的URI路徑,甚至包括使用webapp2_extras.routes.PathPrefixRoute創建嵌套的路線有用信息:

def get_route_list(router): 
    """ 
    Get a nested list of all the routes in the app's router 
    """ 
    def get_routes(r): 
    """get list of routes from either a router object or a PathPrefixRoute object, 
    because they were too stupid to give them the same interface. 
    """ 
    if hasattr(r, 'match_routes'): 
     return r.match_routes 
    else: 
     return list(r.get_routes()) 

    def get_doc(handler, method): 
    """get the doc from the method if there is one, 
    otherwise get the doc from the handler class.""" 
    if method: 
     return getattr(handler,method).__doc__ 
    else: 
     return handler.__doc__ 

    routes=[] 
    for i in get_routes(router): 
    if hasattr(i, 'handler'): 
     # I think this means it's a route, not a path prefix 
     cur_template = i.template 
     cur_handler = i.handler 
     cur_method = i.handler_method 
     cur_doc  = get_doc(cur_handler,cur_method) 
     r={'template':cur_template, 'handler':cur_handler, 'method':cur_method, 'doc':cur_doc} 
    else: 
     r=get_route_list(i) 
    routes.append(r) 
    return routes 

這將返回列表的嵌套列表,但是如果你只想要一個平坦的列表(其實我這樣做),你就可以用這裏的功能將其壓平:Flattening a shallow list in python 注意:您可能需要編輯壓扁淺列表功能也可以避免迭代字典。也就是說,在這裏添加:「...而不是isinstance(el,basestring),而不是isinstance(el,dict)」

這應該是顯而易見的,但是我看到代碼的方式,它會給你自定義方法中的文檔字符串,如果有的話;否則,它會爲您提供處理程序類的文檔字符串。這個想法是,這應該是有用的OP的目的,這也是我想要做的。