bottle:全局路由过滤器

时间:2015-10-26 04:14:37

标签: python routes bottle

我使用瓶子作为显示日历的简单应用程序,并允许用户指定年份和月份。定义了以下路由:
' /' #当前年度和当前月份
' /年' #year和当月
' /年/月' #year and month

但是,没有识别出额外/最后的路线。例如。 ' / 2015'没关系,但' / 2015 /' ISN'吨。为了克服这个问题,我使用了正则表达式routing filter。这有效,但是我可以为每条路线定义一个模式,然后明确检查路线是否以' /'结尾。我想定义一个全局过滤器,它从请求URL的末尾删除额外的斜杠(如果存在的话)。

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)

2 个答案:

答案 0 :(得分:2)

我建议不要创建重复的路由,而是建议使用以斜杠结尾的网址强制执行严格的网址架构,并鼓励客户端通过从不以斜杠结尾的网址重定向来使用它,例如使用以下路由:

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

(顺便说一句,这是django&#39; s default behavior)。

答案 1 :(得分:2)

The Bottle docs提到了你的问题,这是他们的建议:

  

添加一个WSGI中间件,用于从所有URL中删除尾部斜杠

  

添加before_request挂钩以去除尾部斜杠

两者的例子可以是found in the docs