dimid
dimid

Reputation: 7631

bottle: global routing filter

I'M using bottle for a simple app that displays a calendar, and allows the user to specify the year and the month. The following routes are defined:
'/' # current year and current month
'/year' # year and current month
'/year/month' # year and month

However, routes that have an extra / at the end aren't recognized. E.g. '/2015' is ok, but '/2015/' isn't. In order to overcome this, I used a regex routing filter. This works, but makes me define a pattern for each route, and then check explicitly if the route ends with '/'. I'd like to define a global filter which removes the extra slash from the end of the request url (if such exists).

from bottle import route, run, template
import calendar
import time

CAL = calendar.HTMLCalendar(calendar.SUNDAY)
Y, M = time.strftime('%Y %m').split()

@route('/')
@route('/<year:re:\d{4}/?>')
@route('/<year>/<month:re:\d{1,2}/?>')
def cal(year = Y, month = M):
    y = year if year[-1] != '/' else year[:-1]
    m = month if month[-1] != '/' else month[:-1]
    return template(CAL.formatmonth(int(y), int(m))) 

run(host='localhost', port=8080, debug=True)

Upvotes: 2

Views: 352

Answers (2)

ron rothman
ron rothman

Reputation: 18128

The Bottle docs mention your very question, and here's what they suggest:

add a WSGI middleware that strips trailing slashes from all URLs

or

add a before_request hook to strip the trailing slashes

Examples of both can be found in the docs.

Upvotes: 2

Udi
Udi

Reputation: 30472

Instead of creating duplicate routes, I would suggest enforcing a strict url schema with urls ending with slashes and encouraging clients to use it by redirecting from urls not ending with a slash, for example using the following route:

@route('<path:re:.+[^/]$>')
def add_slash(path):
    return redirect(path + "/")

(BTW, this is django's default behavior).

Upvotes: 2

Related Questions