While working on a pet project I really wanted a rails rake equivalent for Flask.
Googling led to http://flask.pocoo.org/snippets/117/ which gave me enough direction to figure out how to make that work with Python 3.5 and Flask 0.12.
The biggest problem I had with that snippet is that it didn’t account for URL variable rules.
/foo/<int:bar>
as it would blow up because werkzeug & Flask sanitize inputs to ensure they match the expected type.
I started doing some seriously crazy stuff like monkey patching the rules temporarily to make
ALL converters run through a String/Unicode converter. It’s at this point that I noticed in dbgp (symbolic debugger) that it was naturally converting the rules to strings.
@App.cli.command("list_routes")
def list_routes():
"""
Roll through Flask's URL rules and print them out
Thank you to Jonathan Tushman
And Thank you to Roger Pence
Sourced http://flask.pocoo.org/snippets/117/ "Helper to list routes (like Rail's rake routes)"
Note that a lot has possibly changed since that snippet and rule classes have a __str__
which greatly simplifies all of this
"""
format_str = lambda *x: "{:30s} {:40s} {}".format(*x)#pylint: disable=W0108
clean_map = defaultdict(list)
for rule in App.url_map.iter_rules():
methods = ",".join(rule.methods)
clean_map[rule.endpoint].append((methods, str(rule),))
print(format_str("View handler", "HTTP METHODS", "URL RULE"))
print("-"*80)
for endpoint in sorted(clean_map.keys()):
for rule, methods in sorted(clean_map[endpoint], key=lambda x: x[1]):
print(format_str(endpoint, methods, rule))
Example output
"HOSTED@LOCAL:5000"
View handler HTTP METHODS URL RULE
--------------------------------------------------------------------------------
Equipment /equipment/ OPTIONS,POST
Equipment /equipment/ HEAD,OPTIONS,GET
Equipment /equipment/ HEAD,OPTIONS,GET,PUT,DELETE
index / HEAD,OPTIONS,GET
static /static/ HEAD,OPTIONS,GET