Marcel Hellkamp [recently added a small feature][3] to Bottle that makes it easy to inspect an application’s routes and determine if a particular route is actually for a mounted sub-application.
([Bottle is a small module written in Python for making websites][4].)
Route objects (items in the `app.routes` list) now have extra information when the route was created by mounting one app on another, in the form of a new key `mountpoint` in `route.config`.
Here’s a trivial app with another app mounted on it:
import bottle
app1 = bottle.Bottle()
@app1.route(‘/’)
def app1_home(): return “Hello World from App1”
app2 = bottle.Bottle()
@app2.route(‘/’)
def app2_home(): return “Hello World from App2”
app1.mount(prefix=’/app2/’, app=app2)
And a utility function that returns a generator of prefixes and routes:
def inspect_routes(app):
for route in app.routes:
if ‘mountpoint’ in route.config:
prefix = route.config[‘mountpoint’][‘prefix’]
subapp = route.config[‘mountpoint’][‘target’]
for prefixes, route in inspect_routes(subapp):
yield [prefix] + prefixes, route
else:
yield [], route
Finally, inspecting all the routes (including mounted sub-apps) for the root Bottle object:
for prefixes, route in inspect_routes(app1):
abs_prefix = ‘/’.join(part for p in prefixes for part in p.split(‘/’))
print abs_prefix, route.rule, route.method, route.callback
This new feature is sure to revolutionise everything.
[1]: http://blog.nturn.net/?p=289
[2]: http://jason.cleanstick.net/post/19943282016/stupid-simple-api-reference-for-bottle-py-web-services
[3]: https://github.com/bottlepy/bottle/commit/9b24401605e0470388a65c80a0964cba2bf64caf
[4]: http://bottlepy.org/
Thanks, helpful. I wonder if there is a way to display the routes with the static ones first, in the actual order searched by the Router?