如何在web.py中列出所有可用的URL使用情况

时间:2017-07-29 04:09:47

标签: python web.py

dayClick

如果访问/路径,我想列出所有可用的网址。任何自动方法?

1 个答案:

答案 0 :(得分:1)

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

urls = ('foo', 'foo',
        'bar', 'bar',
        '/', index)

所以,诀窍就是打印出偶数元素:

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

现在,有一些并发症。

  1. 如果您通过wsgi托管此内容,则可能是您的网络服务器仅向webpy传递了前缀为(例如)/app的内容。所以"真实"网址应为/app/foo,' / app / bar`等。您无法通过自己的应用程序判断。
  2. 您列出的项目可能(通常是)正则表达式,因此您生成的列表可能不是简单的URL列表。 (考虑dashboard/(mail|settings|status)会允许三个网址:dashboard/maildashboard/settingsdashboard/status
  3. 最后,奇数项,虽然通常是一个字符串,但可以改为类web.application,您可以在其中为其所有网址递归到该应用程序中。
  4. 例如:

    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