<div dir="ltr"><div class="gmail_default" style="font-family:arial,sans-serif">I'm returning to Flask after several years away (and never having done much of any significance with it before). I'm having trouble with the mapping between routes and the functions which handle them.</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">I have two functions, each of which is meant to handle a number of related routes. The first is just supposed to normalize things and do a permanent redirect to the second</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">@app.route('/<int:year>-<int:month>/html/<filename>')</font></div><div class="gmail_default" style=""><font face="monospace">@app.route('/CR/<int:year>-<int:month>/html/<filename>')</font></div><div class="gmail_default" style=""><font face="monospace">@app.route('/<int:year>-<int:month>')</font></div><div class="gmail_default" style=""><font face="monospace">@app.route('/<int:year>-<int:month>/<filename>')</font></div><div class="gmail_default" style=""><font face="monospace">def old_cr_month(year, month, filename="index.html"):</font></div><div class="gmail_default" style=""><font face="monospace">    print(">> old_cr_month:", year, month, filename)</font></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">    raise Exception</font></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">    return redirect(url_for("cr", year=year, month=month,</font></div><div class="gmail_default" style=""><font face="monospace">                            filename=filename),</font></div><div class="gmail_default" style=""><font face="monospace">                    code=301)</font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">@app.route("/CR")</font></div><div class="gmail_default" style=""><font face="monospace">@app.route("/CR/")</font></div><div class="gmail_default" style=""><font face="monospace">@app.route('/CR/<int:year>/<int:month>')</font></div><div class="gmail_default" style=""><font face="monospace">@app.route('/CR/<int:year>/<int:month>/<filename>')</font></div><div class="gmail_default" style=""><font face="monospace">def cr(year=None, month=None, filename="index.html"):</font></div><div class="gmail_default" style=""><font face="monospace">    print(">> cr:", year, month, filename)</font></div><div class="gmail_default" style=""><font face="monospace">    ...</font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">When I visit this URL:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace"><a href="http://super.secret.website/CR/2000-09/html/maillist.html">http://super.secret.website/CR/2000-09/html/maillist.html</a></font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style=""><font face="monospace">old_cr_month</font><span style="font-family:arial,sans-serif"> is called, as I expect. Its </span><font face="monospace">print</font><span style="font-family:arial,sans-serif"> function is called and the embedded exception is raised.</span></div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">When I visit this URL:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace"><a href="http://super.secret.website/CR/2000-09/html/threads.html">http://super.secret.website/CR/2000-09/html/threads.html</a></font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style=""><span style="font-family:arial,sans-serif">the </span><font face="monospace">old_cr_month</font><font face="arial, sans-serif"> handler isn't called. Instead, the </font><font face="monospace">cr</font><font face="arial, sans-serif"> function is enlisted to handle the request </font><font face="arial, sans-serif">and its </font><font face="monospace">print</font><font face="arial, sans-serif"> function is called. Strangely, it does seem to </font><font face="arial, sans-serif">get </font><font face="monospace">year</font><font face="arial, sans-serif">, </font><font face="monospace">month</font><font face="arial, sans-serif"> and </font><font face="monospace">filename</font><font face="arial, sans-serif"> correct. This despite none of the defined routes for cr having URL templates with either the </font><font face="monospace">year-month</font><font face="arial, sans-serif"> form or an embedded </font><font face="monospace">html</font><font face="arial, sans-serif"> directory in the middle.</font></div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style=""><span style="font-family:arial,sans-serif">When I dump the </span><font face="monospace">app</font><font face="arial, sans-serif"> object in the debugger the displayed </font><font face="monospace">url_map</font><font face="arial, sans-serif"> looks to me like </font><font face="monospace">old_cr_month</font><font face="arial, sans-serif"> should have handled the URL (my candidate route mapping highlighted in red).</font></div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">Map([<Rule '/hello' (HEAD, OPTIONS, GET) -> hello>,</font></div><div class="gmail_default" style=""><font face="monospace"> <Rule '/CR/' (HEAD, OPTIONS, GET) -> cr>,</font></div><div class="gmail_default" style=""><font face="monospace"> <Rule '/CR' (HEAD, OPTIONS, GET) -> cr>,</font></div><div class="gmail_default" style=""><font face="monospace"> <Rule '/' (HEAD, OPTIONS, GET) -> index>,</font></div><div class="gmail_default" style=""><font face="monospace"> <font color="#ff0000"><Rule '/CR/<year>-<month>/html/<filename>' (HEAD, OPTIONS, GET) -> old_cr_month></font>,</font></div><div class="gmail_default" style=""><font face="monospace"> <Rule '/<year>-<month>/html/<filename>' (HEAD, OPTIONS, GET) -> old_cr_month>,</font></div><div class="gmail_default" style=""><font face="monospace"> <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,</font></div><div class="gmail_default" style=""><font face="monospace"> <Rule '/CR/<year>/<month>/<msg>' (HEAD, OPTIONS, GET) -> cr_message>,</font></div><div class="gmail_default" style=""><font face="monospace"> <Rule '/CR/<year>/<month>/<filename>' (HEAD, OPTIONS, GET) -> cr>,</font></div><div class="gmail_default" style=""><font face="monospace"> <Rule '/CR/<year>/<month>' (HEAD, OPTIONS, GET) -> cr>,</font></div><div class="gmail_default" style=""><font face="monospace"> <Rule '/<year>-<month>/<filename>' (HEAD, OPTIONS, GET) -> old_cr_month>,</font></div><div class="gmail_default" style=""><font face="monospace"> <Rule '/<year>-<month>' (HEAD, OPTIONS, GET) -> old_cr_month>])</font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">Here's my setup:</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_default" style=""><font face="monospace">$ flask --version</font></div><div class="gmail_default" style=""><font face="monospace">Python 3.10.1</font></div><div class="gmail_default" style=""><font face="monospace">Flask 2.0.2</font></div><div class="gmail_default" style=""><font face="monospace">Werkzeug 2.0.2</font></div></blockquote><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">I'm running in an Ubuntu 20.04 VM.</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">What am I missing about routes here? How can two so similarly structured URLs be mapped to different handler functions? Is there something I can do to dig into the URL-to-handler mapping process?</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">Thx,</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,sans-serif">Skip Montanaro</div><div class="gmail_default" style="font-family:arial,sans-serif"><br></div></div>