web.py中seeother()重定向失效:访问/health/返回None而非HAPPY
问题根源与解决方法
问题1:路由匹配顺序导致请求走了错误处理类
web.py的路由是从上到下依次匹配的,你的/(.*)/规则排在/health前面,当请求/health/时,会先被这个正则规则捕获,进入redirect类处理,而非预期的health类。
问题2:重定向方法未返回响应对象
redirect类的GET方法里调用了web.seeother(),但没有返回这个方法生成的响应对象——web.py要求处理方法必须返回响应内容(或响应对象),否则会默认返回None。
修复方案(任选其一)
方案1:让重定向类正确返回响应
修改redirect类的GET方法,返回web.seeother()的结果,这样请求/health/会被重定向到/health,最终得到HAPPY:
class redirect: def GET(self, path): return web.seeother('/' + path)
方案2:调整路由顺序并添加尾斜杠路由(推荐)
把/health相关路由移到正则路由前面,同时添加/health/直接指向health类,避免重定向,直接返回结果:
urls = ( '/', 'index', '/health', 'health', '/health/', 'health', '/(.*)/', 'redirect', )
方案3:优化正则路由排除特定路径
如果不想调整路由顺序,可以修改正则规则,排除/health/这类特定路径,让它能匹配到后面的/health路由:
urls = ( '/', 'index', '/(?!health)(.*)/', 'redirect', # 不匹配以health开头的带尾斜杠路径 '/health', 'health' )
内容的提问来源于stack exchange,提问作者Jerrin
相关产品推荐
相关产品推荐

