Marcel Hellkamp recently added a small feature 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.
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
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.