Python 如何在web.py中列出所有可用的url用法

Python 如何在web.py中列出所有可用的url用法,python,web.py,Python,Web.py,如果访问/path,我想列出所有可用的URL。任何自动方法?web.py使用偶数元素描述路径,奇数元素提供url处理程序。这就是为什么它通常写为: urls = ( 'foo','foo','bar','bar', '/', index) 所以,诀窍就是简单地打印出偶数元素: urls = ('foo', 'foo', 'bar', 'bar', '/', index) 现在,有一些复杂问题 如果您是通过wsgi托管的,那么您的Web服务器可能只向webpy传

如果访问/path,我想列出所有可用的URL。任何自动方法?

web.py使用偶数元素描述路径,奇数元素提供url处理程序。这就是为什么它通常写为:

urls = ( 'foo','foo','bar','bar', '/', index)
所以,诀窍就是简单地打印出偶数元素:

urls = ('foo', 'foo',
        'bar', 'bar',
        '/', index)
现在,有一些复杂问题

如果您是通过wsgi托管的,那么您的Web服务器可能只向webpy传递前缀为例如/app的内容。所以真正的URL应该是/app/foo、/app/bar等等。你无法从你的应用程序中分辨出来。 列出的项目通常可能是正则表达式,因此生成的列表可能不是简单的URL列表。考虑仪表板/邮件的设置,状态允许三个URL:仪表板/邮件,仪表板/设置和仪表板/状态 最后,奇数编号的项(通常是字符串)可以由类web.application代替,在该类中,您可以递归到该应用程序中,以获取其所有URL。 例如:

>>> [urls[i] for i in xrange(0, len(urls), 2)]
['foo', 'bar', '/']
运行:

import web

def p(app, prefix=None):
    mapping = app.mapping
    for pattern, what in mapping:
        if isinstance(what, basestring):
            print "{}{}".format(prefix + '/' if prefix else '', pattern)
        else:
            p(what, prefix=pattern)


if __name__ == '__main__':
    # "blog" sub-application which handles blog-related urls                                                                                                                                  
    blog_urls = ('create', 'blog.Create', 'edit', 'blog.Edit', 'delete', 'blog.Delete')
    blog_app = web.application(blog_urls, globals())

    # "main" application which handles most urls, but passed blog URL to sub-application                                                                                                      
    main_urls = ('/account', 'account', '/settings', 'settings', '/blog', blog_app)
    main_app = web.application(main_urls, globals())
    p(main_app)
$ python foo.py
/account
/settings
/blog/create
/blog/edit
/blog/delete